我使用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;
}
我的问题是,我在这里做得不对,这将使图像显示的是这样的:
我缺少标头信息还是什么?