如何在C ++中将yuy2转换为BITMAP

时间:2010-12-20 16:30:36

标签: c++ bitmap camera directshow

我正在使用安全摄像头DLL从相机中检索图像。 DLL调用我的程序的函数传递图像缓冲区作为参数,但图像是yuy2格式。我需要将此缓冲区转换为RGB,但我尝试了在Internet上找到的每个公式都没有成功。我尝试的每个例子(包括http://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx#yuvformats_2)都给了我错误的颜色。

我只能使用像素的Y分量将缓冲区转换为BW图像,但我真的需要彩色图片。我调试(仅汇编)在屏幕上显示图像的DLL,它使用DirectDraw来执行此操作。

4 个答案:

答案 0 :(得分:11)

使用问题中Microsoft link的信息:

for (int i = 0;  i < width/2;  ++i)
{
    int y0 = ptrIn[0];
    int u0 = ptrIn[1];
    int y1 = ptrIn[2];
    int v0 = ptrIn[3];
    ptrIn += 4;
    int c = y0 - 16;
    int d = u0 - 128;
    int e = v0 - 128;
    ptrOut[0] = clip(( 298 * c + 516 * d + 128) >> 8); // blue
    ptrOut[1] = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8); // green
    ptrOut[2] = clip(( 298 * c + 409 * e + 128) >> 8); // red
    c = y1 - 16;
    ptrOut[3] = clip(( 298 * c + 516 * d + 128) >> 8); // blue
    ptrOut[4] = clip(( 298 * c - 100 * d - 208 * e + 128) >> 8); // green
    ptrOut[5] = clip(( 298 * c + 409 * e + 128) >> 8); // red
    ptrOut += 6;
}

答案 1 :(得分:2)

这个公式有效:

int C = luma - 16;
int D = cr - 128;
int E = cb - 128;
r = (298*C+409*E+128)/256;
g = (298*C-100*D-208*E+128)/256;
b = (298*C+516*D+128)/256;

我从matlab示例中得到了这个。

问题是:在内存中,Windows位图不是RGB,它们是BGR。如果要写入内存缓冲区,则需要执行以下操作:

rgbbuffer[rgbindex] = (char)b;
rgbbuffer[rgbindex + 1] = (char)g;
rgbbuffer[rgbindex + 2] = (char)r;

答案 2 :(得分:1)

如果您已经使用DirectShow从安全摄像头获取视频数据,那么您只需将“Color Space Converter Filter”添加到DirectShow图表即可。但是如果你还没有使用DirectShow(听起来你不是这样)那么使用Daniel链接的公式将数据转换为RGB会更加简单。将DirectShow添加到项目中非常复杂。

答案 3 :(得分:0)

您必须编写自己的转换器。 GDI +不知道如何处理YUY2位图。

here

请注意,2个像素共享相同的颜色值,并具有不同的亮度值。

Here是一些帮助您编写转换器的公式。