gpt4 book ai didi

c++ - ISampleGrabber::BufferCB 到 IplImage;在 OpenCV 中显示显示乱码图像 - C++

转载 作者:太空宇宙 更新时间:2023-11-03 22:59:32 30 4
gpt4 key购买 nike

我正在使用 DirectShow 访问视频流,然后使用 SampleGrabber 过滤器和接口(interface)从每个帧中获取样本以进行进一步的图像处理。我正在使用回调,所以它会在每个新帧之后被调用。我基本上只是从 PlayCap 示例应用程序开始工作,并向图中添加了一个示例过滤器。

我遇到的问题是我试图在不同的 OpenCV 窗口上显示抓取的样本。但是,当我尝试将缓冲区中的信息转换为 IplImage 时,我得到了乱码的像素。 BufferCB 调用的代码如下,没有任何正确的错误处理:

STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen)
{
AM_MEDIA_TYPE type;
g_pGrabber->GetConnectedMediaType(&type);
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER *)type.pbFormat;

BITMAPINFO* bmi = (BITMAPINFO *)&pVih->bmiHeader;
BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
int channels = bmih->biBitCount / 8;

mih->biPlanes = 1;
bmih->biBitCount = 24;
bmih->biCompression = BI_RGB;

IplImage *Image = cvCreateImage(cvSize(bmih->biWidth, bmih->biHeight), IPL_DEPTH_8U, channels);

Image->imageSize = BufferLen;
CopyMemory(Image->imageData, pBuffer, BufferLen);
cvFlip(Image);

//openCV Mat creation
Mat cvMat = Mat(Image, true);
imshow("Display window", cvMat); // Show our image inside it.
waitKey(2);


return S_OK;
}

我的问题是,我在这里做错了什么会使显示的图像看起来像这样:

我是否缺少 header 信息或其他信息?

最佳答案

引用的代码是解决方案的一部分。您在此处创建具有特定宽度/高度的图像对象,其中包含 8 位像素数据和未知的 channel /组件数。然后你从另一个未知格式的缓冲区复制数据。

它运作良好的唯一机会是所有未知数无需您的努力即可惊人地匹配。因此,您基本上需要首先检查 Sample Grabber 输入引脚上的媒体类型。然后,如果它不是你想要的,你必须分别更新你的代码。 SG 的下游连接是什么,特别是它是否连接到视频渲染器,这可能也很重要。

关于c++ - ISampleGrabber::BufferCB 到 IplImage;在 OpenCV 中显示显示乱码图像 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21902048/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com