- int convert_yuv_to_rgb_pixel(int y, int u, int v)
- {
- uint pixel32 = 0;
- uchar *pixel = (uchar *)&pixel32;
- int r, g, b;
- r = y + (1.370705 * (v-128));
- g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));
- b = y + (1.732446 * (u-128));
- if(r > 255) r = 255;
- if(g > 255) g = 255;
- if(b > 255) b = 255;
- if(r < 0) r = 0;
- if(g < 0) g = 0;
- if(b < 0) b = 0;
- pixel[0] = r * 220 / 256;
- pixel[1] = g * 220 / 256;
- pixel[2] = b * 220 / 256;
- return pixel32;
- }
- /*yuv格式转换为rgb格式*/
int convert_yuv_to_rgb_pixel(int y, int u, int v)
{
uint pixel32 = 0;
uchar *pixel = (uchar *)&pixel32;
int r, g, b;
r = y + (1.370705 * (v-128));
g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));
b = y + (1.732446 * (u-128));
if(r > 255) r = 255;
if(g > 255) g = 255;
if(b > 255) b = 255;
if(r < 0) r = 0;
if(g < 0) g = 0;
if(b < 0) b = 0;
pixel[0] = r * 220 / 256;
pixel[1] = g * 220 / 256;
pixel[2] = b * 220 / 256;
return pixel32;
}
/*yuv格式转换为rgb格式*/
- int convert_yuv_to_rgb_buffer(uchar *yuv, uchar *rgb, uint width,uint height)
- {
- uint in, out = 0;
- uint pixel_16;
- uchar pixel_24[3];
- uint pixel32;
- int y0, u, y1, v;
- for(in = 0; in < width * height * 2; in += 4) {
- pixel_16 =
- yuv[in + 3] << 24 |
- yuv[in + 2] << 16 |
- yuv[in + 1] << 8 |
- yuv[in + 0];//YUV422每个像素2字节,每两个像素共用一个Cr,Cb值,即u和v,RGB24每个像素3个字节
- y0 = (pixel_16 & 0x000000ff);
- u = (pixel_16 & 0x0000ff00) >> 8;
- y1 = (pixel_16 & 0x00ff0000) >> 16;
- v = (pixel_16 & 0xff000000) >> 24;
- pixel32 = convert_yuv_to_rgb_pixel(y0, u, v);
- pixel_24[0] = (pixel32 & 0x000000ff);
- pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
- pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
- rgb[out++] = pixel_24[0];
- rgb[out++] = pixel_24[1];
- rgb[out++] = pixel_24[2];//rgb的一个像素
- pixel32 = convert_yuv_to_rgb_pixel(y1, u, v);
- pixel_24[0] = (pixel32 & 0x000000ff);
- pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
- pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
- rgb[out++] = pixel_24[0];
- rgb[out++] = pixel_24[1];
- rgb[out++] = pixel_24[2];
- }
- return 0;
- }
int convert_yuv_to_rgb_buffer(uchar *yuv, uchar *rgb, uint width,uint height)
{
uint in, out = 0;
uint pixel_16;
uchar pixel_24[3];
uint pixel32;
int y0, u, y1, v;
for(in = 0; in < width * height * 2; in += 4) {
pixel_16 =
yuv[in + 3] << 24 |
yuv[in + 2] << 16 |
yuv[in + 1] << 8 |
yuv[in + 0];//YUV422每个像素2字节,每两个像素共用一个Cr,Cb值,即u和v,RGB24每个像素3个字节
y0 = (pixel_16 & 0x000000ff);
u = (pixel_16 & 0x0000ff00) >> 8;
y1 = (pixel_16 & 0x00ff0000) >> 16;
v = (pixel_16 & 0xff000000) >> 24;
pixel32 = convert_yuv_to_rgb_pixel(y0, u, v);
pixel_24[0] = (pixel32 & 0x000000ff);
pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
rgb[out++] = pixel_24[0];
rgb[out++] = pixel_24[1];
rgb[out++] = pixel_24[2];//rgb的一个像素
pixel32 = convert_yuv_to_rgb_pixel(y1, u, v);
pixel_24[0] = (pixel32 & 0x000000ff);
pixel_24[1] = (pixel32 & 0x0000ff00) >> 8;
pixel_24[2] = (pixel32 & 0x00ff0000) >> 16;
rgb[out++] = pixel_24[0];
rgb[out++] = pixel_24[1];
rgb[out++] = pixel_24[2];
}
return 0;
}
V4L2_PIX_FMT_YUYV — Packed format with ½ horizontal chroma resolution, also known as YUV 4:2:2
In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr. Each Y goes to one of the pixels, and the Cb and Cr belong to both pixels. As you can see, the Cr and Cb components have half the horizontal resolution of the Y component. V4L2_PIX_FMT_YUYV is known in the Windows environment as YUY2.
Color Sample Location.
| 0 | 1 | 2 | 3 | ||||
| 0 | Y | C | Y | Y | C | Y | |
| 1 | Y | C | Y | Y | C | Y | |
| 2 | Y | C | Y | Y | C | Y | |
| 3 | Y | C | Y | Y | C | Y |
本文详细介绍了如何将YUV422格式的数据转换为RGB格式,并提供了具体的C++实现代码。通过解析YUV422格式的特点及其与RGB之间的转换公式,帮助读者理解色彩空间的转换原理。

2862

被折叠的 条评论
为什么被折叠?



