读书人

自己写的YUV2转RGB函数转换后图像变

发布时间: 2012-03-06 20:47:55 作者: rapoo

自己写的YUV2转RGB函数,转换后图像变色
函数如下:
void CVideoCap::YUV2_RGB( BYTE *YUY2buff, BYTE *RGBbuff, DWORD dwYUVSize )
{
//Algorithm:
//R = Y + 1.4075 *(V-128)
//G = Y - 0.3455 *(U 128) 0.7169 *(V 128)
//B = Y + 1.779 *(U 128)

//要用整型运算代替浮点运算,当然是要用移位的办法了,我们可以很容易得到下列算法:

//u = YUVdata[UPOS] - 128;
//v = YUVdata[VPOS] - 128;

//rdif = v + ((v * 103) >> 8);
//invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
//bdif = u +( (u*198) >> 8);

//r = YUVdata[YPOS] + rdif;
//g = YUVdata[YPOS] - invgdif;
//b = YUVdata[YPOS] + bdif;

int R, G, B;
int/*float*/ Y, U, Y1, V;
BYTE *poriYUV2buff = YUY2buff;
BYTE *poriRGBbuff = RGBbuff;

for ( DWORD i = 0; i < dwYUVSize; i += 4 )
{
//1. 获取Y U V 数值,
//YUV2格式的排列是Y0,V0,Y1,U0, Y2,V2,Y3,U2
Y = *(YUY2buff++);
U = *(YUY2buff++);
Y1 = *(YUY2buff++);
V = *(YUY2buff++);


//2. 计算 R G B 值
U -= 128;
V -= 128;

int rdif= V + ((V * 103) >> 8);
int invgdif = ((U * 88) >> 8) + ((V * 183) >> 8);
int bdif= U +( (U * 198) >> 8);

R = Y + rdif;
G = Y - invgdif;
B = Y + bdif;


//3. 溢出处理
if ( R > 255 ) R = 255; if ( R < 0 ) R = 0;
if ( G > 255 ) G = 255; if ( G < 0 ) G = 0;
if ( B > 255 ) B = 255; if ( B < 0 ) B = 0;


//4. 输出 R G B
//一个YUV2包含两个像素, 所以需要两个RGB像素表示
*(RGBbuff++) = (byte)R;
*(RGBbuff++) = (byte)G;
*(RGBbuff++) = (byte)B;

*(RGBbuff++) = (byte)R;
*(RGBbuff++) = (byte)G;
*(RGBbuff++) = (byte)B;
}

YUY2buff = poriYUV2buff;
RGBbuff = poriRGBbuff;
}

用此函数转换后,显示出来的图像,红色变成蓝色,蓝色变成红色。怎么回事,我对图形处理不是很懂,求高手指点。

[解决办法]
应该了解yuv2存储格式

你参考一下http://www.emsym.com/blog/?p=2116

读书人网 >VC/MFC

热点推荐