如何从摄像机迭代YUV NV12缓冲区中的像素并在Obj-c中设置颜色?

问题描述 投票:0回答:1

我需要遍历YUV NV12缓冲区的像素并设置颜色。我能得到的最接近的答案是这个,但这是针对BGR缓冲区的:https://stackoverflow.com/a/37346547/568531

我认为NV12格式的转换应该很容易,但我不知道。如果我可以将顶部的50x50像素(以0,0设置为白色)设置为白色。预先谢谢你。

Edit:这是我到目前为止的内容。有点工作,但是没有一个正方形,而是一个垂直的矩形,因此数学运算在某处不正确:

uint8_t  *lumaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
uint8_t  *chromaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 1);
uint8_t  lumaBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
uint8_t  chromaBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 1);

        for(int column = 0; column <= 50; column++)
        {
            for(int row = 0; row <= 50; row++)
            {
                uint8_t *lumapixel = lumaBaseAddress + (row + column * lumaBytesPerRow);
                uint8_t *chromapixel = chromaBaseAddress + ((column/2)*chromaBytesPerRow+(row/2) * 2);

                lumapixel[0] = 0;
                lumapixel[1] = 0;
                lumapixel[2] = 0;
                lumapixel[3] = 0;

                chromapixel[0] = 255; // cyan ?
                chromapixel[1] = 255; // yellow ?
                chromapixel[2] = 0; 
            }
        }
ios objective-c avfoundation cvpixelbuffer
1个回答
1
投票

您是否尝试将前3个字节(12位)*像素数设置为全0x00或全0xFF?由于您似乎并不关心转换,因此只需覆盖缓冲区就足够了。如果这样可行,则可以解决其他问题,例如找到正确的颜色并生成矩形而不是线条。

首先,您需要了解YUV编码。 https://wiki.videolan.org/YUV#NV12。根据本文档,您很可能需要覆盖Y范围和UV范围中的位。因此要在两个不同的位置进行书写。这与所有像素颜色都具有紧密局部性的RGB缓冲区完全相反。因此,您可以开始并覆盖Y范围内的前8位以及UV范围内的前2位或后2位。那应该将一个像素设置为与以前不同的颜色。

最后,您可以处理50x50矩形的显示。您需要知道图像的尺寸,因为您需要在每行之后偏移(如果缓冲区是按行传输的!)。例如,此图:

.------.
|xx    |
|xx    |
|      |
'------'

在具有行主要传输值的rgb颜色空间中,缓冲区看起来像这样:xx0000xx0000000000。因此,您将需要覆盖字节0-6和字节18-24(RGB)。因为:第一范围* 3字节RGB。然后下一个范围从行号(1)*图像宽度(6)* 3字节(RGB)开始,依此类推。您必须对YUV颜色空间应用相同的想法。

© www.soinside.com 2019 - 2024. All rights reserved.