ISampleGrabber :: BufferCB到IplImage结构; 在OpenCV中显

2019-09-30 07:48发布

我使用DirectShow访问的视频流,然后使用SampleGrabber过滤器和接口,用于从每帧进一步的图像处理得到的样品。 我使用一个回调,所以它得到每一个新的帧后调用。 我基本上只是从PlayCap示例应用程序工作,并增加了一个样品过滤器的图形。

我遇到的问题是,我想不同的OpenCV的窗口上显示抓起样本。 然而,当我试着投中的信息缓冲区的IplImage结构,我得到像素的乱码一塌糊涂。 对于BufferCB调用的代码如下,SANS任何正确的错误处理:

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

我的问题是,我在这里做得不对,这将使图像显示的是这样的:

我缺少标头信息还是什么?

Answer 1:

所引用的代码是解决方案的一部分。 这里创建一定宽度/高度的8位像素数据和未知的信道/元件数量的图像对象。 然后你从未知格式的另一个缓冲区拷贝数据。

它的工作很好唯一的机会是所有未知令人惊讶不符合你的努力。 所以,你基本上需要开始检查介质类型到底是什么样区采集卡的输入引脚。 然后,如果它是不是你想要的,你必须分别更新您的代码。 这也可能是重要的什么是SG的下游连接,以及是否连接到具体的视频渲染器。



文章来源: ISampleGrabber::BufferCB to IplImage; display in OpenCV shows garbled image - C++