视频流YUV422转RGB24,用RGB24图像显示出来.图像偏绿色不知道如何优化,求高手支招
视频流YUV422转RGB24,用RGB24图像显示出来.图像偏绿色不知道怎么优化,求高手支招
视频流YUV422转RGB24,用RGB24图像显示出来.图像偏绿色不知道怎么优化,求高手支招!
下面是YUV422转RGB24的代码:
int convert_yuv_to_rgb_pixel(int y, int u, int v)
{
unsigned int pixel32 = 0;
unsigned char *pixel = (unsigned char *)&pixel32;
double r1,g1,b1;
int r, g, b;
/* r1 = y + (1.402 * (v-128));
g1 = y - (0.71414 * (v-128)) - (0.34414 * (u-128));
b1 = y + (1.772* (u-128));*/
r1 = max(0,min(255,1.164*(y - 16) + 1.793*(u - 128)));
g1 = max(0,min(255,1.164*(y - 16) - 0.534*(u - 128) - 0.213*(v - 128)));
b1 = max(0,min(255,1.164*(y - 16) + 2.115*(u - 128)));
r=(int)r1;
g=(int)g1;
b=(int)b1;
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 ;
pixel[1] = g;
pixel[2] = b ;
return pixel32;
}
int convert_yuv_to_rgb_buffer(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height)
{
unsigned int in, out = 0;
unsigned int pixel_16;
unsigned char pixel_24[3];
unsigned int 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];
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];
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;
}
关于这个函数的参数解释如下:
yuv:YUV422数据的起始地址
rgb:转换后的数据的起始地址
width:摄像头采集数据时所设置的图片宽度(如:320)
height:摄像头采集数据时所设置的图片高度(如:240)
图像偏绿色,如果把摄像头全部遮住,黑色也就显示为绿色了。
------解决思路----------------------
https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=yuv422%E8%BD%ACrgb&oq=yuv422%E8%BD%ACrgb&rsv_pq=cc3a48c800001006&rsv_t=6b6eiPDWKft3KwBY44p3voGG6AsoDqzJrrefjpAvktUE6Qn3deRyrJlzBd0&rsv_enter=0&prefixsug=yuv422%E8%BD%ACrgb&rsp=0
视频流YUV422转RGB24,用RGB24图像显示出来.图像偏绿色不知道怎么优化,求高手支招!
下面是YUV422转RGB24的代码:
int convert_yuv_to_rgb_pixel(int y, int u, int v)
{
unsigned int pixel32 = 0;
unsigned char *pixel = (unsigned char *)&pixel32;
double r1,g1,b1;
int r, g, b;
/* r1 = y + (1.402 * (v-128));
g1 = y - (0.71414 * (v-128)) - (0.34414 * (u-128));
b1 = y + (1.772* (u-128));*/
r1 = max(0,min(255,1.164*(y - 16) + 1.793*(u - 128)));
g1 = max(0,min(255,1.164*(y - 16) - 0.534*(u - 128) - 0.213*(v - 128)));
b1 = max(0,min(255,1.164*(y - 16) + 2.115*(u - 128)));
r=(int)r1;
g=(int)g1;
b=(int)b1;
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 ;
pixel[1] = g;
pixel[2] = b ;
return pixel32;
}
int convert_yuv_to_rgb_buffer(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height)
{
unsigned int in, out = 0;
unsigned int pixel_16;
unsigned char pixel_24[3];
unsigned int 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];
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];
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;
}
关于这个函数的参数解释如下:
yuv:YUV422数据的起始地址
rgb:转换后的数据的起始地址
width:摄像头采集数据时所设置的图片宽度(如:320)
height:摄像头采集数据时所设置的图片高度(如:240)
图像偏绿色,如果把摄像头全部遮住,黑色也就显示为绿色了。
------解决思路----------------------
https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=yuv422%E8%BD%ACrgb&oq=yuv422%E8%BD%ACrgb&rsv_pq=cc3a48c800001006&rsv_t=6b6eiPDWKft3KwBY44p3voGG6AsoDqzJrrefjpAvktUE6Qn3deRyrJlzBd0&rsv_enter=0&prefixsug=yuv422%E8%BD%ACrgb&rsp=0