bmp格式图片转成yuv格式,转换颜色有偏差

Do_Change_Lyd 2014-08-27 10:33:41
求大神指点,我的摄像头捕捉的jpeg图像解码成bmp格式的,图片是这样的
将bmp格式图片转成yuv格式的,图片变成这样了
好像是颜色有偏差,颜色位置不对,是什么原因?代码很多就不贴了,请大神大概说下原因,谢谢!!
...全文
949 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
boy_li02 2014-12-06
  • 打赏
  • 举报
回复
bmp格式图片里,图像数据存储方式是倒叙式,你可以尝试将bmp图片数据内容放到缓存中显示,显示结果是翻转的, 在对BMP图像数据转为YUV前,需要先将bmp格式数据翻转一下。 还有. 注意一下你的bmp文件,是24位色不?
Do_Change_Lyd 2014-12-05
  • 打赏
  • 举报
回复
引用
我也在用这段代码,发现一个问题,就是原本的bmp图像只要是宽和高是一样的那么转换后就没事,但是如果你原本的bmp图像宽和高不是一样的数值,就会出现一些干扰,楼主可以试试 如果把原始图像的大小改成 宽和高一致,试试
可是不可能每张bmp图片都是正方形的,这样的话就很受限制了不是吗?
燕子要努力 2014-10-19
  • 打赏
  • 举报
回复
我也在用这段代码,发现一个问题,就是原本的bmp图像只要是宽和高是一样的那么转换后就没事,但是如果你原本的bmp图像宽和高不是一样的数值,就会出现一些干扰,楼主可以试试 如果把原始图像的大小改成 宽和高一致,试试
JiMoKuangXiangQu 2014-08-27
  • 打赏
  • 举报
回复
可以贴一下从 RGB 转 YUV 计算的代码片段。
falloutmx 2014-08-27
  • 打赏
  • 举报
回复
我觉得是你YUV的存放顺序有问题
Do_Change_Lyd 2014-08-27
  • 打赏
  • 举报
回复
你们看转换成yuv格式后的图片,原本应该在左边的部分跑到右边去了,怎么会这样?
Do_Change_Lyd 2014-08-27
  • 打赏
  • 举报
回复
引用
可以贴一下从 RGB 转 YUV 计算的代码片段。
看不懂rgb2yuv这块代码,大神能否给小弟解析下:initLookupTable()为什么这样初始化颜色转换空间的,还有具体转换时怎么转化的,谢谢!! 代码:


float RGBYUV02990[256],RGBYUV05870[256],RGBYUV01140[256];
float RGBYUV01684[256],RGBYUV03316[256];
float RGBYUV04187[256],RGBYUV00813[256];

void initLookupTable();
bool RGB2YUV(unsigned long w,unsigned long h,unsigned char * rgbData,unsigned char * y,unsigned char * u,unsigned char *v)
{
	initLookupTable();//初始化查找表
	unsigned char *ytemp = NULL;
	unsigned char *utemp = NULL;
	unsigned char *vtemp = NULL;
	utemp = (unsigned char *)malloc(w*h);
	vtemp = (unsigned char *)malloc(w*h);
	
	unsigned long i,j,nr,ng,nb,nSize;
	//对每个像素进行 rgb -> yuv的转换
	for (i=0,nSize=0;nSize<w*h*3;nSize+=3)
	{
		nb = rgbData[nSize];
		ng = rgbData[nSize+1];
		nr = rgbData[nSize+2];
		y[i] = (unsigned char)(RGBYUV02990[nr]+RGBYUV05870[ng]+RGBYUV01140[nb]);
		utemp[i] = (unsigned char)(-RGBYUV01684[nr]-RGBYUV03316[ng]+nb/2+128);
		vtemp[i] = (unsigned char)(nr/2-RGBYUV04187[ng]-RGBYUV00813[nb]+128);
		i++;
	}
	//对u信号及v信号进行采样
	int k = 0;
	for (i=0;i<h;i+=2)
		for(j=0;j<w;j+=2)
		{
			u[k]=(utemp[i*w+j]+utemp[(i+1)*w+j]+utemp[i*w+j+1]+utemp[(i+1)*w+j+1])/4;
			v[k]=(vtemp[i*w+j]+vtemp[(i+1)*w+j]+vtemp[i*w+j+1]+vtemp[(i+1)*w+j+1])/4;
			k++;
		}
	//对y、u、v 信号进行抗噪处理
	for (i=0;i<w*h;i++)
	{
		if(y[i]<16)
			y[i] = 16;
		if(y[i]>235)
			y[i] = 235;
	}
	for(i=0;i<h*w/4;i++)
	{
		if(u[i]<16)
			u[i] = 16;
		if(v[i]<16)
			v[i] = 16;
		if(u[i]>240)
			u[i] = 240;
		if(v[i]>240)
			v[i] = 240;
	}
	if(utemp)
		free(utemp);
	if(vtemp)
		free(vtemp);
	return true;
}

void initLookupTable()
{
	int i;
	for (i=0;i<256;i++)
	{
		RGBYUV02990[i] = (float)0.2990 * i;
		RGBYUV05870[i] = (float)0.5870 * i;
		RGBYUV01140[i] = (float)0.1140 * i;
		RGBYUV01684[i] = (float)0.1684 * i;
		RGBYUV03316[i] = (float)0.3316 * i;
		RGBYUV04187[i] = (float)0.4187 * i;
		RGBYUV00813[i] = (float)0.0813 * i;
	}
}
Do_Change_Lyd 2014-08-27
  • 打赏
  • 举报
回复
引用
我觉得是你YUV的存放顺序有问题
可是它就是这么存放的,没错吧,先存放Y数据, 再存放V 然后U.代码:
	unsigned int size = bmp.width*bmp.height;

	if(fwrite(yuv.Y,1,size,outFile) != size)
		return false;
	if(fwrite(yuv.V,1,size/4,outFile) != size/4)
		return false;
	if (fwrite(yuv.U,1,size/4,outFile) != size/4)
		return false;

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧