iPadおよびiPhoneのフロントカメラは、瞬間的なアプリケーションの作成者から新しいアイデアを生み出しました。 また、デュアルチャンバーの電話についても少し調査し、興味のあるボタンをクリックしてください。
iOS 4.3以降のビデオキャプチャは、オレンジのように簡単です。
4回の呼び出し-あなたは、2台のカメラiPhoneのいずれかから受信したピクセルの所有者です。
少しのコード、デザイナーは読みません
HabrahabrViewを開始します
クラスHabrahabrView
@class CaptureSessionManager; @interface HabrahabrView : UIView <AVCaptureVideoDataOutputSampleBufferDelegate> { CaptureSessionManager *captureFront; CaptureSessionManager *captureBack; UIImageView *face; }
クラス本体では、必須のcaptureOutput関数を導入します。この関数では、ビデオカメラからの画像が1秒間に20回送信されます。
captureOutput関数
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); // Lock the base address of the pixel buffer CVPixelBufferLockBaseAddress(imageBuffer, 0); // Get the number of bytes per row for the pixel buffer // void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); // Get the number of bytes per row for the pixel buffer size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); // Get the pixel buffer width and height size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); unsigned char* pixel = (unsigned char *)CVPixelBufferGetBaseAddress(imageBuffer); CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); CGContextRef context=CGBitmapContextCreate(pixel, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little|kCGImageAlphaPremultipliedFirst); CGImageRef image=CGBitmapContextCreateImage(context); CGContextRelease(context); CGColorSpaceRelease(colorSpace); UIImage *resultUIImage=[UIImage imageWithCGImage:image]; CGImageRelease(image); CVPixelBufferUnlockBaseAddress(imageBuffer, 0); [resultUIImage retain]; [self performSelectorOnMainThread:@selector(cameraCaptureGotFrame:) withObject:resultUIImage waitUntilDone:NO]; } - (void) cameraCaptureGotFrame:(UIImage*)image { face.image = [self fixOrientation:image]; // decrement ref count [image release]; }
すべての準備作業が終了したので、ビデオが表示される画面で画像を開始します
Small ImageView 58 x 70
face = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 58, 70)]; [self addSubview:face];
これがリアカメラの接続方法です
背面カメラの準備ができました
[self setCaptureBack:[[[CaptureSessionManager alloc] init] autorelease]]; [[self captureBack] addVideoInput:2 PView:self]; [[self captureBack] addVideoPreviewLayer]; [[[self captureBack] captureSession] setSessionPreset:AVCaptureSessionPresetLow];
それで前部
フロントカメラ準備完了
[self setCaptureFront:[[[CaptureSessionManager alloc] init] autorelease]]; [[self captureFront] addVideoInput:1 PView:self]; [[self captureFront] addVideoPreviewLayer]; [[[self captureFront] captureSession] setSessionPreset:AVCaptureSessionPresetLow];
すべての関数を個別のクラスに作りましょう。
ここに退屈なコードがあります、読まないでください
できた
#import "CaptureSessionManager.h" @implementation CaptureSessionManager @synthesize captureSession; @synthesize previewLayer; - (id)init { if ((self = [super init])) { [self setCaptureSession:[[AVCaptureSession alloc] init]]; } return self; } - (void)addVideoPreviewLayer { [self setPreviewLayer:[[[AVCaptureVideoPreviewLayer alloc] initWithSession:[self captureSession]] autorelease]]; [[self previewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill]; } - (void)addVideoInput:(int)camType PView:(HabrahabrView*) habraview { NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; AVCaptureDevice *videoDevice = nil; NSInteger side = (camType==1) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack; for (AVCaptureDevice *device in videoDevices) { if (device.position == side) { videoDevice = device; break; } } if (videoDevice == nil) { videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } if (videoDevice) { NSError *error; AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; if (!error) { if ([[self captureSession] canAddInput:videoIn]) [[self captureSession] addInput:videoIn]; else NSLog(@"Couldn't add video input"); // Set the output AVCaptureVideoDataOutput* videoOutput = [[AVCaptureVideoDataOutput alloc] init]; // create a queue to run the capture on dispatch_queue_t captureQueue=dispatch_queue_create("catpureQueue", NULL); // setup our delegate [videoOutput setSampleBufferDelegate:habraview queue:captureQueue]; // configure the pixel format videoOutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil]; if ([[self captureSession] canAddOutput:videoOutput]) [[self captureSession] addOutput:videoOutput]; else NSLog(@"Couldn't add video ouput"); } else NSLog(@"Couldn't create video input"); } else NSLog(@"Couldn't create video capture device"); } - (void)dealloc { [[self captureSession] stopRunning]; [previewLayer release], previewLayer = nil; [captureSession release], captureSession = nil; [super dealloc]; } @end
カメラを操作する
フロントカメラの電源を入れます
[[captureFront captureSession] startRunning];
すべてが機能します。 コードからわかるように、ビデオは3つの解像度でプルできます。 速度のために、最小のAVCaptureSessionPresetLow(約144 x 192ピクセル)を選択します。 必要に応じて、これで十分であり、画像フィルターは無料です。
今すぐリアカメラをオンにする方法は? 前面を停止して背面をオンにします
[[captureFront captureSession] stopRunning]; [[captureBack captureSession] startRunning];
すぐに両方を含めたかった。 ああ。 不可能。 カメラをすばやく切り替えようとしましたが、約3分の1秒の遅延があり、それがイライラを引き起こすだけです。
2つの画像をオンラインでオーバーレイするという夢は、殺さなければなりませんでした。
フルーツ
しかし、いくつかの愚かなアプリケーションの夢を殺さないでください。 私はすぐにフルーツシャッターを作成することにしました。フロントカメラからの画像は本物で、オレンジは仮想です。
オレンジが交互に画面に落ちます。 彼らは口から摂取して食べなければなりません。 7個のオレンジをより速く食べる人は賞品です。
口の認識手順を記述することは残っています。
口を認識することは原始的な教訓であり、私でさえ、OOPの言葉OpenSiViに憧れている人でさえ、この機能を迅速に作成しました。 OOPまたはOpenSiViを使用していません。
ヒント-オレンジの位置を知っていて、それから踊ります。
うん、注意深い読者は叫ぶだろう-彼の職場を照らすとき、認識手順は著者だけでデバッグされる。 あなたは正しいですが、ユーザーの写真から判断すると、このアプリケーションは中国からブラジル、オフィスからアパートまで正常に機能します。
もちろん、7番目のオレンジを食べたときにユーザーの写真を盗みたいという誘惑がありました。 私はいつも誘惑に負けます。それは二度と起こらないからです。 落ち着いた 道徳の愛好家のために、ボタンを追加しました-あなたの写真を送信することを許可します。 デフォルトはオフです。
58 x 70のプレーヤーの小さな写真を送って、ひそかに賞賛します。 非常に面白い写真に出くわします。 私は時々3分間笑います。
神のために、写真について話すのではなく、企業秘密を守ってください。
私は完全に忘れました。 私の記録は12秒です。 オリンピックの準備をしています。
ロンドンで会いましょう。