- 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 |