1

AVCaptureSessionを使用して、ビデオキャプチャセッションを開始し、ビデオフレームからピクセルカラーを読み取ります。動画の設定はこんな感じです。

NSDictionary* videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                               [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA],
                               kCVPixelBufferPixelFormatTypeKey,
                               nil];

以下のデリゲートメソッドを使用してサンプルバッファを取得します。サンプルバッファは後でピクセルカラーを読み取ります。

- (void)captureOutput:(AVCaptureOutput *)captureOutput // captureOutput is only the AVCaptureVideoDataOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
       fromConnection:(AVCaptureConnection *)connection 
{ 

    NSAutoreleasePool * pool = [NSAutoreleasePool new]; // instrument tells it leaks

    /*******  START CALCULATION  *******/

    imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(imageBuffer,0); // lock image buffer
    buffer_baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); // raw buffer data BGRA

...

変数buffer_baseAddressはピクセルの色を格納する配列であり、kCVPixelFormatType_32BGRA設定すると、配列は[B] [G] [R] [A] [B] [G] [R] [A][B]..のように配置されます。 [B] [G][R][A]。したがって、ある座標のピクセルで色を取得するには、バッファ内の3つのインデックスを把握する必要があります。したがって、(x、y)=(10,0)では、BGRはインデックス40、41、および42になります。

ここに問題があります。サンプルバッファの最初の行(y == 0)は、常に正しい色を示しているようです。しかし、2行目以降(y> 0)に移動すると、一部のプリセットで、またはフロント/バックカメラを使用して間違った色になりました。これは、特定の設定で、バッファの各行の最後に不明な追加データが追加されているようなものです。幸いなことに、私の実験から、バックカメラでAVCaptureSessionPresetHighを使用し、フロント/バックカメラの両方でAVCaptureSessionPresetMediumを使用すると、サンプルバッファが各行である程度シフトすることがわかりました。AVCaptureSessionクラスの1つでrowPadding=0を設定しても、どちらも役に立たないことを思い出しました。(正確な変数を忘れてしまい申し訳ありません。数か月前のことです。)

この問題の原因は何ですか?そして、これを解決するために私は何ができますか?

4

2 に答える 2

1

Apple Docs のこのページの CMSampleBuffer を UIImage に変換するセクションをご覧ください。試したことはありませんがbytesPerRow、バッファのパディングを含む取得方法を示しています。

CoreVideo、CoreImage、Quartz、Quicktime などを使用しているかどうかに関係なく、画像バッファーが最適な値にパディングされるのは正常です。それが何であるかを見つける方法は常にあります。

于 2012-12-05T18:23:08.227 に答える
0

これが私の現在の解決策です。最高のものではありませんが、それは私がそれを乗り越えるのに役立ちます。私はすべてAVCaptureSessionPresetをテストして、どれが間違ったピクセルを読み取ったかを確認します。次に、その余分なパディングのサイズを推測し、サンプルバッファインデックスを計算するときにそれを使用しようとします。このマジックナンバーは8で、これを見つけるのに何日もかかりました。したがって、少なくとも回避策として、これが誰かに役立つことを願っています。:-)

    // Look like this magic padding is affected by AVCaptureSessionPreset and front/back camera
    if ([[self currentPresetSetting] isEqualToString:AVCaptureSessionPresetHigh] && ![self isUsingFrontFacingCamera]) {
        buffer_rowPixelPadding = 8;
    }
    else if ([[self currentPresetSetting] isEqualToString:AVCaptureSessionPresetMedium]) {
        buffer_rowPixelPadding = 8;
    }
    else {
        buffer_rowPixelPadding = 0; // default
    }
于 2012-12-05T17:30:21.820 に答える