100分求教YUV422转RGB问题
求教
从摄像头传来一副图片,颜色是YUV422的,但是要转换称RGB的颜色在程序中显示出来,不知如何从YUV422转到RGB,上网查了个资料,
R = Y + 1.140V
G = Y - 0.395U - 0.581V
B = Y + 2.032U
但是转换后显示出来出来是花屏,晕死
各位强人们,救救我吧,有转换的方法或者有关资料,麻烦告知,谢谢
小弟100分奉上
问题点数:100、回复次数:3Top
1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-01 16:04:00 得分 100
void CColorSpaceConvector::YUV2RGB(BYTE * pDest, BYTE * pSrc, DWORD dwRGBBit,
DWORD dwDestPitch, DWORD dwSrcPitch,
int nHeight, UINT nWidth)
{
UINT nLength = nWidth * ((dwRGBBit + 7) / 8);
if (nHeight <= 0)
{
nHeight = -nHeight;
switch (dwRGBBit)
{
case 15:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
UINT b = Trunc((y << 8) + n1) >> 11;
UINT g = Trunc((y << 8) + n2) >> 11;
UINT r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 10) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + n1) >> 11;
g = Trunc((y << 8) + n2) >> 11;
r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 10) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
case 16:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
UINT b = Trunc((y << 8) + n1) >> 11;
UINT g = Trunc((y << 8) + n2) >> 10;
UINT r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 11) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + n1) >> 11;
g = Trunc((y << 8) + n2) >> 10;
r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 11) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
case 24:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 6, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
pDest[j ] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) + n3) >> 8);
y = pSrc[k+2];
pDest[j+3] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+4] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) + n3) >> 8);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
case 32:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 8, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
pDest[j ] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) + n3) >> 8);
pDest[j+3] = 0;
y = pSrc[k+2];
pDest[j+4] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+6] = (BYTE) (Trunc((y << 8) + n3) >> 8);
pDest[j+7] = 0;
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
}
}
else
{
pDest += (nHeight - 1) * dwDestPitch;
switch (dwRGBBit)
{
case 15:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
UINT g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 11;
UINT r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 10) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 11;
r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 10) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
case 16:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
UINT g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 10;
UINT r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 11) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 10;
r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 11) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
case 24:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 6, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
pDest[j ] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
y = pSrc[k+2];
pDest[j+3] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+4] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
case 32:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 8, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
pDest[j ] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
pDest[j+3] = 0;
y = pSrc[k+2];
pDest[j+4] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+6] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
pDest[j+7] = 0;
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
}
}
}Top
2 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-01 16:05:14 得分 0
其实,传过来的YUV422数据,你应该创建一个Overlay平面,直接显示,这样效率比较高,效果也比较好,就不用转换了。Top
3 楼yousure(人类)回复于 2005-07-01 16:34:03 得分 0
Overlay能否说的详细点
不是很懂Top




