C++ 这是哪种YUV格式?真的吗?

C++ 这是哪种YUV格式?真的吗?,c++,video,rgb,yuv,C++,Video,Rgb,Yuv,下面是假定的YUV420SP缓冲区的te RGB输出。没有转换,我只是将YUV420SP显示为RGB,只是为了查看一些模式 图像位于大小为width*height*3的单个无符号字符*缓冲区中。如果这确实是YUV420SP,那么我应该将Y作为黑白图像,然后进行UV交错。我想我应该将Y视为黑白图像,但为什么它在我的图像中重复3次呢?我应该在紫外线部分看到什么吗 当然,我试图将这个缓冲区转换为RGB。我用过,但我只得到一个完全黑色的图像 我以前做过一些YUV渲染器 YUV 420缓冲区应包含Y的wi

下面是假定的YUV420SP缓冲区的te RGB输出。没有转换,我只是将YUV420SP显示为RGB,只是为了查看一些模式

图像位于大小为
width*height*3
的单个
无符号字符*
缓冲区中。如果这确实是YUV420SP,那么我应该将Y作为黑白图像,然后进行UV交错。我想我应该将Y视为黑白图像,但为什么它在我的图像中重复3次呢?我应该在紫外线部分看到什么吗

当然,我试图将这个缓冲区转换为RGB。我用过,但我只得到一个完全黑色的图像


我以前做过一些YUV渲染器

YUV 420缓冲区应包含Y的
width*height
字节,U的
(width*height)/4的
字节,V的
(width*height)/4的
字节。因此,如果YUV字节缓冲区的大小应包含
(width*height*3)/2的
字节

要查看描述的灰度模式,需要将“Y”字节转换为24位RGB,如下所示:

大概是这样的:

unsigned char* YUV_BYTES = < some buffer of size (width*height*3)/2 with bytes copied in>
unsigned char* RGB_BYTES = < some buffer of size width*height*3 >

const unsigned char* dst = RGB_BYTES;
for (unsigned int r = 0; r < height; r++)
{
    unsigned int row_offset = r*width;
    for (unsigned int c = 0; c < width; c++)
    {
        *dst[0] = YUV[row_offset + c];  // R
        *dst[1] = YUV[row_offset + c];  // G
        *dst[2] = YUV[row_offset + c];  // B
        dst += 3;
    }
}
unsigned char*YUV_BYTES=<一些大小为(宽*高*3)/2的缓冲区,其中复制了字节>
无符号字符*RGB_字节=
常量无符号字符*dst=RGB_字节;
for(无符号整数r=0;r

我认为还有一个隐含的假设,YUV图像的宽度和高度总是可以被4整除。根据图形库和平台的不同,渲染器可能会颠倒绘制此图像。

我以前做过一些YUV渲染器

YUV 420缓冲区应包含Y的
width*height
字节,U的
(width*height)/4的
字节,V的
(width*height)/4的
字节。因此,如果YUV字节缓冲区的大小应包含
(width*height*3)/2的
字节

要查看描述的灰度模式,需要将“Y”字节转换为24位RGB,如下所示:

大概是这样的:

unsigned char* YUV_BYTES = < some buffer of size (width*height*3)/2 with bytes copied in>
unsigned char* RGB_BYTES = < some buffer of size width*height*3 >

const unsigned char* dst = RGB_BYTES;
for (unsigned int r = 0; r < height; r++)
{
    unsigned int row_offset = r*width;
    for (unsigned int c = 0; c < width; c++)
    {
        *dst[0] = YUV[row_offset + c];  // R
        *dst[1] = YUV[row_offset + c];  // G
        *dst[2] = YUV[row_offset + c];  // B
        dst += 3;
    }
}
unsigned char*YUV_BYTES=<一些大小为(宽*高*3)/2的缓冲区,其中复制了字节>
无符号字符*RGB_字节=
常量无符号字符*dst=RGB_字节;
for(无符号整数r=0;r
我认为还有一个隐含的假设,YUV图像的宽度和高度总是可以被4整除。根据图形库和平台的不同,渲染器可能会颠倒绘制此图像。

格式如下(也称为YV12

I420是YUV 4:2:0格式,具有全平面有序格式。
在YUV420中,Y颜色通道是每个像素的亮度。
U和V是色度(颜色)通道。
U和V的分辨率在两个轴上都是Y的一半(在每个轴上以0.5的系数进行下采样)

I420插图:

假设
unsigned char*src
是指向帧缓冲区的指针,分辨率为640x480:

src ->               YYYYYY  
                     YYYYYY  
                     YYYYYY  
                     YYYYYY  
src + 640*480     -> UUU  
                     UUU  
src + (320*240)*5 -> VVV  
                     VVV  
我使用MATLAB代码从您发布的图像恢复RGB图像

结果如下:


MATLAB代码(仅供参考):

I=imread('Test.png');
R=I(:,:,1);G=I(:,:,2);B=I(:,:,3);
T=零(大小(R,1),大小(R,2)*3,'uint8');
T(:,1:3:end)=R;T(:,2:3:end)=G;T(:,3:3:end)=B;
T=T';T=T(:);
Y=T(1:640*480);
U=T(640*480+1:640*480+640*480/4);
V=T(640*480+640*480/4+1:640*480+(640*480/4)*2);
Y=(重塑(Y[640480])”;
U=(重塑(U[320240])”;
V=(重塑(V[320240])”;
U=imresize(U,2);
V=imresize(V,2);
YUV=cat(3,Y,U,V);
RGB=ycbcr2rgb(YUV);
格式如下(也称为YV12

I420是YUV 4:2:0格式,具有全平面有序格式。
在YUV420中,Y颜色通道是每个像素的亮度。
U和V是色度(颜色)通道。
U和V的分辨率在两个轴上都是Y的一半(在每个轴上以0.5的系数进行下采样)

I420插图:

假设
unsigned char*src
是指向帧缓冲区的指针,分辨率为640x480:

src ->               YYYYYY  
                     YYYYYY  
                     YYYYYY  
                     YYYYYY  
src + 640*480     -> UUU  
                     UUU  
src + (320*240)*5 -> VVV  
                     VVV  
我使用MATLAB代码从您发布的图像恢复RGB图像

结果如下:


MATLAB代码(仅供参考):

I=imread('Test.png');
R=I(:,:,1);G=I(:,:,2);B=I(:,:,3);
T=零(大小(R,1),大小(R,2)*3,'uint8');
T(:,1:3:end)=R;T(:,2:3:end)=G;T(:,3:3:end)=B;
T=T';T=T(:);
Y=T(1:640*480);
U=T(640*480+1:640*480+640*480/4);
V=T(640*480+640*480/4+1:640*480+(640*480/4)*2);
Y=(重塑(Y[640480])”;
U=(重塑(U[320240])”;
V=(重塑(V[320240])”;
U=imresize(U,2);
V=imresize(V,2);
YUV=cat(3,Y,U,V);
RGB=ycbcr2rgb(YUV);

能否显示将缓冲区转换为RGB的代码?您分配了什么格式的RGB屏幕?您是如何将YUV字节转储到RGB缓冲区的?能否将缓冲区作为灰度图像(而不是屏幕截图)发布?我想灰度的尺寸应该是宽x高*1.5。至少在图像的预期分辨率后…@selbie这是代码:,我将提供一个buffer@LucasZanella-我的意思是您将YUV字节直接转储到渲染器中的代码。或者至少分享原始的YUV文件本身。你能展示你的代码吗