|
今天在做摄像头采集,用V4L2做的,程序下到板上后,摄像头采集回来的视频出现严重失真和有一条一条的花痕闪过,有做过的能给点提示吗。下面是我的YUV赚RGB程序,怀疑是算法出问题了。
/*yuv格式转换为rgb格式*/
int ProcessImage::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 char pixel_32[4];
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_32[0] = (pixel32 & 0x000000ff);
pixel_32[1] = (pixel32 & 0x0000ff00) >> 8;
pixel_32[2] = (pixel32 & 0x00ff0000) >> 16;
pixel_32[3] = (pixel32 & 0xff000000) >> 24;
rgb[out++] = pixel_32[0];
rgb[out++] = pixel_32[1];
rgb[out++] = pixel_32[2];
rgb[out++] = pixel_32[3];
pixel32 = convert_yuv_to_rgb_pixel(y1, u, v);
pixel_32[0] = (pixel32 & 0x000000ff);
pixel_32[1] = (pixel32 & 0x0000ff00) >> 8;
pixel_32[2] = (pixel32 & 0x00ff0000) >> 16;
pixel_32[3] = (pixel32 & 0xff000000) >> 24;
rgb[out++] = pixel_32[0];
rgb[out++] = pixel_32[1];
rgb[out++] = pixel_32[2];
rgb[out++] = pixel_32[3];
}
return 0;
}
/*yuv格式转换为rgb格式*/
int ProcessImage::convert_yuv_to_rgb_pixel(int y, int u, int v)
{
unsigned int pixel32 = 0;
unsigned char *pixel = (unsigned char *)&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;
pixel[3] = 255;
return pixel32;*/
int r, g, b,a;
const int csY_coeff_16 = 1.164383*(1<<16);
const int csU_blue_16 = 2.017232*(1<<16);
const int csU_green_16 = (-0.391762)*(1<<16);
const int csV_green_16 = (-0.812968)*(1<<16);
const int csV_red_16 = 1.596027*(1<<16);
int Ye=csY_coeff_16 * (y - 16);
int Ue=u-128;
int Ve=v-128;
r= ( Ye + csV_red_16 * Ve )>>16 ;
g= ( Ye + csU_green_16 * Ue + csV_green_16 * Ve )>>16 ;
b= ( Ye + csU_blue_16 * Ue )>>16 ;
a= 255;
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;
pixel[3]=a;
return pixel32;
}
|
|