天嵌 ARM开发社区

 找回密码
 注册
查看: 2777|回复: 2

用V4L2做摄像头采集,出现失真和图片有花痕现象

[复制链接]
涉柘 发表于 2013-4-8 16:59:31 | 显示全部楼层 |阅读模式
今天在做摄像头采集,用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;
}


 楼主| 涉柘 发表于 2013-4-9 10:07:59 | 显示全部楼层
失真问题解决了,Windows下为RGB,linux下为BGR,花痕现象还没解决。
回复

使用道具 举报

TQ-lkp 发表于 2013-4-9 10:54:14 | 显示全部楼层
一般都是数据流转换的时候出的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-24 06:34 , Processed in 2.029960 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表