发现笔记本自带的摄像头不带color space filter, 视频color space是rgb32的,因此加不加color space filter也就不重要了
那么如何抓取图片呢,其实这个功能在transform filter已经很简单了(如果只是单纯的抓取图片,用inplace transform filter就够了),这里贴和上篇文章不同的部分,相同部分就不贴了。
HRESULT CAppTransform::Transform(IMediaSample *pIn, IMediaSample *pOut) { HRESULT hr = Copy(pIn, pOut); if (FAILED(hr)) { return hr; } return Transform(pOut); } // Transform HRESULT CAppTransform::Transform(IMediaSample *pSample) { // Override to do something inside the application // Such as grabbing a poster frame... // ... BYTE *pData; // Pointer to the actual image buffer long lDataLen; // Holds length of any given sample int iPixel; // Used to loop through the image pixels tagRGBQUAD *prgb; // Holds a pointer to the current pixel AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType(); VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat; ASSERT(pvi); CheckPointer(pSample,E_POINTER); pSample->GetPointer(&pData); lDataLen = pSample->GetSize(); // Get the image properties from the BITMAPINFOHEADER cxImage = pvi->bmiHeader.biWidth; cyImage = pvi->bmiHeader.biHeight; int numPixels = cxImage * cyImage; if(ISSHOT) { long lSourceSize = pSample->GetActualDataLength(); BYTE *pSourceBuffer; pSample->GetPointer(&pSourceBuffer); if(pBuffer!=NULL) free(pBuffer); pBuffer=(BYTE *)malloc(lSourceSize*sizeof(BYTE)); CopyMemory((PVOID) pBuffer,(PVOID) pSourceBuffer,lSourceSize); SnapshotToFile("hello"); ISSHOT=FALSE; } return S_OK; }应用程序通过控制ISSHOT来赚钱图片,ISSHOT=TRUE,在Transform里就把当前帧给pBuffer.
BOOL CAppTransform::SnapshotToFile(const char * inFile) { IplImage* pSrc; pSrc=cvCreateImage(cvSize(cxImage,cyImage),IPL_DEPTH_8U,3); tagRGBQUAD *prgb; prgb = (tagRGBQUAD*) pBuffer; for(int y=0;y<cyImage;y++) { for(int x=0;x<cxImage;x++) { ((uchar*)(pSrc->imageData+y*pSrc->widthStep))[x*pSrc->nChannels]=prgb->rgbBlue; ((uchar*)(pSrc->imageData+y*pSrc->widthStep))[x*pSrc->nChannels+1]=prgb->rgbGreen; ((uchar*)(pSrc->imageData+y*pSrc->widthStep))[x*pSrc->nChannels+2]=prgb->rgbRed; prgb++; } } cvSaveImage("D:\\test.bmp",pSrc); return TRUE; }把pBuffer里面的数据存成图片,我们采用opencv的iplimage来保存,因为支持保存成各种图片格式。