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

发布于 2024-10-08 11:32:53 字数 406 浏览 3 评论 0原文

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

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

I'm using a security camera DLL to retreive the image from the camera. The DLL call a function of my program passing the image buffer as a parameter, but the image is in yuy2 format. I need to convert this buffer to RGB, but I tried every formula I found on Internet with no success. Every example I tried (including http://msdn.microsoft.com/en-us/library/aa904813(VS.80).aspx#yuvformats_2) gives me wrong colors.

I'm able to convert the buffer to a BW image using only the Y component of the pixel, but I really need the color picture. I debugged (assembly only) the DLL that shows the image in the screen and it uses DirectDraw to do this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

叹梦 2024-10-15 11:32:53

使用 Microsoft 链接中的信息问题:

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;
}

Using the information from the Microsoft link in the question:

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;
}
秋千易 2024-10-15 11:32:53

这个公式有效:

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;

This formula worked:

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;

I got this from a matlab example.

The gotcha is: in memory, Windows bitmaps aren't RGB, they are BGR. If you are writing to a memory buffer, you need to do something like this:

rgbbuffer[rgbindex] = (char)b;
rgbbuffer[rgbindex + 1] = (char)g;
rgbbuffer[rgbindex + 2] = (char)r;
万劫不复 2024-10-15 11:32:53

如果您已使用 DirectShow 从安全摄像头获取视频数据,则只需添加“色彩空间转换器过滤器"到您的 DirectShow 图表。但是,如果您还没有使用 DirectShow(听起来您没有),那么使用 Daniel 链接到的公式自行将数据转换为 RGB 会简单得多。将 DirectShow 添加到项目中非常复杂。

If you were already using DirectShow to get video data out of the security camera, then you could simply add the "Color Space Converter Filter" to your DirectShow graph. But if you aren't using DirectShow already (it sounds like you're not) then it will be much, much simpler to just convert the data to RGB yourself using the formulas that Daniel linked to. Adding DirectShow to a project is very complicated.

箜明 2024-10-15 11:32:53

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

请查看此处

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

这里有一些公式可以帮助您编写转换器。

You will have to write your own converter. GDI+ doesn't know how to deal with YUY2 bitmaps.

Look here.

Please note that 2 pixels share same color values and have different luminance values.

Here are some formulas to help you write your converter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文