3

アプリケーションでは、AVCaptureVideo を使用しました。kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 形式のビデオを取得しました。

今、私はイメージバッファから y-planar と uv-planar を取得しています。

  CVPlanarPixelBufferInfo_YCbCrBiPlanar *planar = CVPixelBufferGetBaseAddress(imageBuffer);

    size_t y-offset = NSSwapBigLongToHost(planar->componentInfoY.offset);
    size_t uv-offset = NSSwapBigLongToHost(planar->componentInfoCbCr.offset);

ここで yuv はバイプラナー形式 (y+UV) です。

UVプラナーとは?これは uuuu,yyyy 形式ですか、それとも uvuvuvuv 形式ですか? u-planar と y-planar を別々に取得するにはどうすればよいですか?

誰でも私を助けることができますか?

4

2 に答える 2

5

Y プレーンは輝度コンポーネントを表し、UV プレーンは Cb および Cr クロマ コンポーネントを表します。

kCVPixelFormatType_420YpCbCr8BiPlanarFullRange 形式の場合、ルマ プレーンはビデオと同じサイズの 8bpp であり、クロマ プレーンは 16bpp ですが、サイズは元のビデオの 4 分の 1 にすぎません。この平面のピクセルごとに 1 つの Cb コンポーネントと 1 つの Cr コンポーネントがあります。

したがって、入力ビデオが 352x288 の場合、Y プレーンは 352x288 8bpp になり、CbCr は 176x144 16bpp になります。これは、12bpp 352x288 画像とほぼ同じ量のデータであることがわかります。これは、RGB888 に必要な量の半分であり、RGB565 よりもさらに少なくなります。

したがって、バッファでは、Y は次のように [YYYYY . . . ] なり、UV は次のようになります。[UVUVUVUVUV . . .]

対RGBはもちろん、 [RGBRGBRGB . . . ]

于 2012-11-19T23:32:48.630 に答える
0

以下のコードは、形式が kCVPixelFormatType_420YpCbCr8BiPlanarFullRange である pixelBuffer から yuv データをコピーします。

CVPixelBufferLockBaseAddress(pixelBuffer, 0);

size_t pixelWidth = CVPixelBufferGetWidth(pixelBuffer);
size_t pixelHeight = CVPixelBufferGetHeight(pixelBuffer);
// y bite size
size_t y_size = pixelWidth * pixelHeight;
// uv bite size
size_t uv_size = y_size / 2;
uint8_t *yuv_frame = malloc(uv_size + y_size);
// get base address of y
uint8_t *y_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
// copy y data
memcpy(yuv_frame, y_frame, y_size);
// get base address of uv
uint8_t *uv_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);
// copy uv data
memcpy(yuv_frame + y_size, uv_frame, uv_size);

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
于 2017-11-29T02:22:28.797 に答える