图像格式RGB24转YUV422(YUYV)转换代码

由于课题项目的需要,需要一张YUV422格式的图像数据,在网上找了好久,没有现成的代码,只有公式,于是自己写了一个,有什么错误请大家多多指教:

/************************************************************************/
/* 按照opencv数据存储格式,函数传参顺序为b、g、r                        */
/************************************************************************/
void yuv2rgb_pixel(uchar b, uchar g, uchar r, uchar &y, uchar &u, uchar &v)
{
	//rgb转yuv公式,参考资料http://www.cnblogs.com/dwdxdy/p/3713990.html
	y = 0.299 * r + 0.587 * g + 0.114 * b;
	u = -0.1687 * r -  0.3313 * g + 0.5 * b + 128;
	v = 0.5 * r - 0.4187 * g -0.0813 * b + 128;
}

/************************************************************************/
/* rgb24转yuv422                                                        */
/************************************************************************/
void yuv2rgb_image(uchar *pRgb, uchar *pYuv, int width, int height)
{
	//考虑到每两个rgb像素对应一个yuyv组合,因此,width应为2的倍数
	int width1 = width = width / 2 * 2;

	for(int h = 0; h < height; h ++)
	{
		uchar *ptr1 = pRgb + h * width * 3;
		uchar *ptr2 = pYuv + h * width * 2;

		for(int w = 0; w < width1; w += 2)
		{
			uchar y1, u1, v1, y2, u2, v2;
			yuv2rgb_pixel(*ptr1 ++, *ptr1 ++, *ptr1 ++, y1, u1, v1);
			yuv2rgb_pixel(*ptr1 ++, *ptr1 ++, *ptr1 ++, y2, u2, v2);
			//u、v分量取平均值
			uchar u = (u1 + u2) / 2;
			uchar v = (v1 + v2) / 2;
			*ptr2 ++ = y1;
			*ptr2 ++ = u;
			*ptr2 ++ = y2;
			*ptr2 ++ = v;
		}
	}
}
YUV422转RGB可参考 http://www.cnblogs.com/lknlfy/archive/2012/04/09/2439508.html

你可能感兴趣的:(图像格式RGB24转YUV422(YUYV)转换代码)