カメラの開発者。 映像

Appleは常に開発者を良好な状態に保ちます。

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秒です。 オリンピックの準備をしています。



ロンドンで会いましょう。



All Articles