カメラからリアルタイムで UIImage を表示しようとしていますが、UIImageView が画像を正しく表示していないようです。これは、AVCaptureVideoDataOutputSampleBufferDelegate
実装する必要があるメソッドです
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
// Create a UIImage from the sample buffer data
UIImage *theImage = [self imageFromSampleBuffer:sampleBuffer];
// NSLog(@"Got an image! %f %f", theImage.size.width, theImage.size.height);
// NSLog(@"The image view is %@", imageView);
// UIImage *theImage = [[UIImage alloc] initWithData:[NSData
// dataWithContentsOfURL:[NSURL
// URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
[self.session stopRunning];
[imageView setImage: theImage];
}
簡単な問題を解決するには:
- UIImagePickerController の使用はオプションではありません (最終的には、実際に画像を処理します)
- ハンドラーが呼び出されていることを知っています (NSLog 呼び出しが行われ、出力が表示されます)
- IBOutlet 宣言が正しく設定されていることはわかっています。上記のコメント付きのコードを使用して、単純
setImage:theImage
に imageView に送信するのではなく、Web から任意の画像を読み込むと、画像は正しく読み込まれます (NSLog への 2 回目の呼び出しで nil 以外のオブジェクトが報告されます)。 imageFromSampleBuffer:
NSLog がサイズを 360x480 と報告しているため、少なくとも基本的な範囲では、取得した画像は問題ありません。これは私が予想したサイズです。
私が使用しているコードは、AVFoundation
Apple から最近投稿されたスニペットで、こちらから入手できます。
特に、これは私が使用するコードで、AVCaptureSession
オブジェクトとフレンド (私はほとんど理解していません) をセットアップし、Core Video バッファーから UIImage オブジェクトを作成します (これがimageFromSampleBuffer
メソッドです)。
最後に、返されたを使用drawInRect:
してプレーンな UIView サブクラスに送信しようとするとアプリケーションがクラッシュする可能性がありますが、上記のように URL からを使用してもクラッシュしません。クラッシュ時のデバッガーからのスタック トレースを次に示します (EXC_BAD_ACCESS シグナルを受け取ります)。UIImage
imageFromSamplerBuffer
UIImage
#0 0x34a977ee in decode_swap ()
#1 0x34a8f80e in decode_data ()
#2 0x34a8f674 in img_decode_read ()
#3 0x34a8a76e in img_interpolate_read ()
#4 0x34a63b46 in img_data_lock ()
#5 0x34a62302 in CGSImageDataLock ()
#6 0x351ab812 in ripc_AcquireImage ()
#7 0x351a8f28 in ripc_DrawImage ()
#8 0x34a620f6 in CGContextDelegateDrawImage ()
#9 0x34a61fb4 in CGContextDrawImage ()
#10 0x321fd0d0 in -[UIImage drawInRect:blendMode:alpha:] ()
#11 0x321fcc38 in -[UIImage drawInRect:] ()
編集:これは、そのコードによって返される UIImage に関する詳細情報です。
hereで説明されている方法を使用して、ピクセルを取得して印刷できます。一見問題ないように見えます (たとえば、アルファ チャネルのすべての値は 255 です)。ただし、バッファ サイズには若干の違いがあります。その URL から Flickr から取得した画像は 375x500 で、期待値である が[pixelData length]
得られます。750000 = 375*500*4
ただし、から返される image のピクセル データimageFromSampleBuffer:
は size691208 = 360*480*4 + 8
であるため、ピクセル データには 8 バイト余分に含まれています。CVPixelBufferGetDataSize
それ自体が、この 8 ずつ離れた値を返します。メモリ内のアラインされた位置にバッファを割り当てることが原因ではないかと一瞬思いましたが、691200 は 256 の倍数なので、それも説明できません。このサイズの不一致は、2 つの UIImage の間で確認できる唯一の違いであり、問題の原因となっている可能性があります。それでも、バッファーに余分なメモリを割り当てることで EXC_BAD_ACCESS 違反が発生する理由はありません。
ご協力いただきありがとうございます。さらに情報が必要な場合はお知らせください。