2012-04-15 25 views
3

AVFoundationを使用してビデオを撮影しています。私はkCVPixelFormatType_420YpCbCr8BiPlanarFullRangeフォーマットで録画しています。 YpCbCr形式のY面から直接グレースケール画像を作成したい。AVFoundation - Yプレーンからグレースケール画像を取得する(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)

私はCGBitmapContextCreateを呼び出すことによってCGContextRefを作成しようとしましたが、問題は色空間とピクセル形式を選択するのがわかりません。

<Error>: CGBitmapContextCreateImage: invalid context 0x0 
<Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 16 bits/pixel; 1-component color space; kCGImageAlphaPremultipliedLast; 192 bytes/row. 

PS:私の英語のため申し訳ありませんが、私は上記のコードを実行すると

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection 
{  
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(imageBuffer,0);   

    /* Get informations about the Y plane */ 
    uint8_t *YPlaneAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0); 
    size_t width = CVPixelBufferGetWidthOfPlane(imageBuffer, 0); 
    size_t height = CVPixelBufferGetHeightOfPlane(imageBuffer, 0); 

    /* the problematic part of code */ 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    CGContextRef newContext = CGBitmapContextCreate(YPlaneAddress, 
    width, height, 8, bytesPerRow, colorSpace, kCVPixelFormatType_1Monochrome); 

    CGImageRef newImage = CGBitmapContextCreateImage(newContext); 
    UIImage *grayscaleImage = [[UIImage alloc] initWithCGImage:newImage]; 

    // process the grayscale image ... 
} 

は、私はこのエラーを得ました。

答えて

2

私が間違っていない場合は、CGContextを経由しないでください。代わりに、データプロバイダを作成してから直接イメージを作成する必要があります。

コードのもう一つの間違いは、kCVPixelFormatType_1Monochrome定数の使用です。これは、Core Graphics(CGライブラリ)ではなく、ビデオ処理(AVライブラリ)で使用される定数です。ちょうどkCGImageAlphaNoneを使用してください。ピクセルあたり1つのコンポーネント(灰色)が必要である(RGBの場合は3つではなく)ことが色空間から導出されること。

それは次のようになります。

CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, YPlaneAdress, 
     height * bytesPerRow, NULL); 
CGImageRef newImage = CGImageCreate(width, height, 8, 8, bytesPerRow, 
     colorSpace, kCGImageAlphaNone, dataProvider, NULL, NO, kCGRenderingIntentDefault); 
CGDataProviderRelease(dataProvider); 
+0

おかげでたくさん!これは、カメラからグレースケールの画像を取得するための最速のアプローチであることは間違いありませんか? – user961912

+0

@ user961912:YpCbCrでのビデオフレームへのアクセスは、WWDCプレゼンテーションに準拠したネイティブフォーマットであるため、高速になるはずです。次のステップでは、最終的に画像で何をするかによって異なります。バーコードスキャンのようないくつかのアプリケーションでは、CGImageやUIImageを作成する必要はありません。 – Codo

+0

ちょっとコド、この回答ありがとう!私は "同じ"結果のビットを達成しようとしている、違いは、私はグレースケールの効果を達成しようとしている、各フレーム(ライブビデオストリーム)、あなたは正しい方向に私を向けることができる任意のチャンス? –

関連する問題