буфер форматирования по формату YUV420P

у меня есть размер изображения 640 x480, и я хочу использовать yv12 в качестве выходного формата. изображение обрабатывается некоторым API, и я хочу получить результат в формате YV12.

То, что я пытаюсь в данный момент, это то, что

целая ширина = 640;
целая высота = 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. Существует API, в котором я передаю входной буфер в формате NV12, и я предполагаю, что он даст мне выходной буфер в формате YV12 (YUV420P). Итак, я создал плоскость Y, и у нее width x height x 1.5 байта. 1.5, потому что YV12 является 12-битным для мата, и аналогично плоскость U имеет width/2 x height/2 x 1.5 байта и аналогично плоскость V. На данный момент меня не волнуют YUV420P и YVU420P, если мой формат правильный, и мне просто нужно поменять местами U и V плоскости.


person Madu    schedule 03.07.2013    source источник
comment
можете ли вы объяснить, почему у вас есть: - byte[] byteArray = new byte[Convert.ToInt32((ширина * высота + (2 * ((ширина * высота)/4))) * 1,5)];   -  person ashishdhiman2007    schedule 11.02.2017


Ответы (1)


Планар 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 пикселями яркости.

person Fredrik Pihl    schedule 09.07.2013
comment
Отличный ответ. Спасибо, Фредрик. - person Whoami; 20.02.2014