| 
 | 
 
今天在做摄像头采集,用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; 
} 
 
 
 |   
 
 
 
 |