1

画像サイズが640 x480あり、そこからの出力形式として yv12 を使用したいと考えています。画像は何らかの API によって処理されており、出力を YV12 形式で取得したいと考えています。

私が現在試していることは、

int 幅 = 640;
int 高さ = 480;

byte[] byteArray = new byte[Convert.ToInt32((幅 * 高さ + (2 * ((幅 * 高さ) / 4))) * 1.5) ];

captureDevice.GetPreviewBufferYCbCr(byteArray)");

            int YLength = Convert.ToInt32(width * height * 1.5);

            // UVlength multipled by 2 because it is for both u and v
            int UVLength = Convert.ToInt32(2 * (width / 2) * (weight / 2)) * 1.5);

            var inputYBuffer = byteArray.AsBuffer(0, YLength);
            var inputUVBuffer = byteArray.AsBuffer(YLength, UVLength);


            var inputBuffers = new IBuffer[] { inputYBuffer, inputUVBuffer };
            var inputScanlines = new uint[] { (uint)YLength, (uint)UVLength  };
            /////Creating input buffer that supports Nv12 format

                Bitmap inputBtm = new Bitmap(
                outputBufferSize,
                ColorMode.Yvu420Sp,
                inputScanlines, // 1.5 bytes per pixel in  Yuv420Sp mode
                inputBuffers);



            //As v length is same as u length in output buffer so v length can be used in both place.
            int vLength = UVLength / 2;
            var outputYBuffer = byteArray.AsBuffer(0, YLength);
            var outputVBuffer = byteArray.AsBuffer(YLength, vLength);
            var outputUBuffer = byteArray.AsBuffer(YLength + vLength, vLength);

            var outputBuffers = new IBuffer[] { outputYBuffer, outputVBuffer, outputUBuffer };
            //
            var outputScanlines = new uint[] { (uint)YLength, (uint)vLength, (uint)vLength };


            Bitmap outputBtm = new Bitmap(
                outputBufferSize,
                ColorMode.Yuv420P,
                outputScanlines, 
                outputBuffers);**strong text**

だから私が聞きたいのは、YUV420Pフォーマットに従って出力バッファを適切に作成していることです。NV12 の入力バッファを渡す API があり、YV12 (YUV420P) 形式の出力バッファが得られると想定しています。だから私はY平面を作成しました、そしてそれはwidth x height x 1.5バイトを持っています. YV12 はマットの 12 ビットであり、同様に U プレーンにはwidth/2 x height/2 x 1.5バイトがあり、同様に V プレーンがあるため、1.5 です。フォーマットが正しい限り、YUV420P と YVU420P については今のところ気にしません。U プレーンと V プレーンを交換するだけです。

4

1 に答える 1

11

YUV 4:2:0 平面は次のようになります。

----------------------
|     Y      | Cb|Cr |
----------------------

どこ:

Y = width x height pixels (bytes)
Cb = Y / 4 pixels (bytes)
Cr = Y / 4 pixels (bytes)

Total num pixels (bytes) = width * height * 3 / 2

これは、ピクセルが 4:2:0 サブサンプリングで配置される方法です。

420

ご覧のとおり、各クロマ値は 4 つの輝度ピクセル間で共有されます。

于 2013-07-09T21:01:50.167 に答える