2013-10-11 67 views
7

私はAVCaptureVideoDataOutputと協力しており、CMSampleBufferRefUIImageに変換したいと考えています。多くの回答がこのUIImage created from CMSampleBufferRef not displayed in UIImageView?AVCaptureSession with multiple previewsYUVの色空間でCMSampleBufferRefをUIImageに変換しますか?

私はBGRAにVideoDataOutput色空間を設定した場合、それは正常に動作しますが、上記のvideoSettingsなし

NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
[dataOutput setVideoSettings:videoSettings]; 

(この答えCGBitmapContextCreateImage errorに入金)のように、同じですが、私が受け取ることになりますBGRAにYUV(デフォルトAVCaptureSession色空間)からの変換のオーバーヘッドがあるので、ブラッドとCodo iで述べたように、次のエラーBGRAでの作業

CGBitmapContextCreate: invalid data bytes/row: should be at least 2560 for 8 integer bits/component, 3 components, kCGImageAlphaPremultipliedFirst. 
<Error>: CGBitmapContextCreateImage: invalid context 0x0 

は、良い選択ではありませんn How to get the Y component from CMSampleBuffer resulted from the AVCaptureSession?

CMSampleBufferRefUIImageに変換し、YUVカラースペースで作業する方法はありますか?

+0

このため、任意のソリューションとして設定されている場合UIImageCMSampleBufferRefを変換するためのコードを共有するので? –

+0

@AdarshVCあなたはそれをより顕著にするために質問に投票してみませんか? – onmyway133

+0

この質問を確認する@stackoverflow.com/questions/3305862/uiimage-created-from-cmsamplebufferref-not-displayed-in-uiimageview –

答えて

7

多くの研究を行い、リンゴの文書とウィキペディスを読んだ後、私は答えを見つけ出し、それは私のために完璧に働いています。将来の読者のためにImはビデオピクセルタイプはkCVPixelFormatType_420YpCbCr8BiPlanarFullRange

// Create a UIImage from sample buffer data 
// Works only if pixel format is kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 
-(UIImage *) imageFromSamplePlanerPixelBuffer:(CMSampleBufferRef) sampleBuffer{ 

    @autoreleasepool { 
     // Get a CMSampleBuffer's Core Video image buffer for the media data 
     CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
     // Lock the base address of the pixel buffer 
     CVPixelBufferLockBaseAddress(imageBuffer, 0); 

     // Get the number of bytes per row for the plane pixel buffer 
     void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); 

     // Get the number of bytes per row for the plane pixel buffer 
     size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0); 
     // Get the pixel buffer width and height 
     size_t width = CVPixelBufferGetWidth(imageBuffer); 
     size_t height = CVPixelBufferGetHeight(imageBuffer); 

     // Create a device-dependent gray color space 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

     // Create a bitmap graphics context with the sample buffer data 
     CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, 
                bytesPerRow, colorSpace, kCGImageAlphaNone); 
     // Create a Quartz image from the pixel data in the bitmap graphics context 
     CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
     // Unlock the pixel buffer 
     CVPixelBufferUnlockBaseAddress(imageBuffer,0); 

     // Free up the context and color space 
     CGContextRelease(context); 
     CGColorSpaceRelease(colorSpace); 

     // Create an image object from the Quartz image 
     UIImage *image = [UIImage imageWithCGImage:quartzImage]; 

     // Release the Quartz image 
     CGImageRelease(quartzImage); 

     return (image); 
    } 
} 
+0

出力画像はグレースケールであることに注意してください。 – Bluewings

+0

他の色はどうですか? – JULIIncognito

+0

@JULIIncognitoは、RGB空間の色空間を変更します。 – Bluewings

関連する問題