【问题标题】:How to convert yuy2 to a BITMAP in C++如何在 C++ 中将 yuy2 转换为 BITMAP
【发布时间】:2011-05-28 08:36:58
【问题描述】:

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

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

【问题讨论】:

  • 我只是在猜测 -> 这不是位顺序问题吗?
  • 致所有像我一样困惑的人。 YUY2 是格式为 Y0 | 的宏像素格式。 U0 | Y1 | V0。每 4 个字节代表两个 RGB 像素。 Y 称为 Luma,U 称为 Cb,V 称为 Cr。

标签: c++ bitmap camera directshow


【解决方案1】:

这个公式有效:

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;

【讨论】:

  • 我的答案对 BGR 有正确的排序,请参见代码 cmets。抱歉,我没有明确指出这一点。对于使用 Windows 位图的人来说,这总是第一个问题,第二个问题是行是颠倒的。
【解决方案2】:

在问题中使用来自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;
}

【讨论】:

  • 您好,我是这个主题的新手,您如何声明输出缓冲区,以及如何将其保存到文件中。你已经有我的选票了。谢谢。
  • @Delta,您可以使用 vector 例如vector&lt;unsigned char&gt; buffer(width*height*3); ptrOut = &amp;buffer[0];。至于保存到已在其他地方回答的文件,例如stackoverflow.com/questions/2654480/…
【解决方案3】:

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

【讨论】:

  • 如果你打开你的链接,你会看到这个过滤器只适用于 RGB。
  • 是的,色彩空间转换器滤镜只进行 RGB -> RGB 转换。
【解决方案4】:

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

here

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

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

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 2013-02-23
    • 2015-01-05
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2010-10-02
    • 2012-06-09
    相关资源
    最近更新 更多