C++ 这是哪种YUV格式?真的吗?
下面是假定的YUV420SP缓冲区的te RGB输出。没有转换,我只是将YUV420SP显示为RGB,只是为了查看一些模式 图像位于大小为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
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文件本身。你能展示你的代码吗