Visual C++编程实现摄像头视频捕捉要点Word下载.docx
《Visual C++编程实现摄像头视频捕捉要点Word下载.docx》由会员分享,可在线阅读,更多相关《Visual C++编程实现摄像头视频捕捉要点Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
//省略初始化部分代码
IBaseFilter*pCap;
//Videocapturefilter.
//省略初始化和添加到FilterGraph部分代码
pBuild->
RenderStream(&
PIN_CATEGORY_PREVIEW,&
MEDIATYPE_Video,pCap,NULL,NULL);
DirectShow提供了一个捕捉静态图像的方法:
使用SampleGrabberfilter。
依次按照以下三个步骤就可以了:
第一步,定义一个类实现SampleGrabber的回调接口IsampleGrabberCB:
classCSampleGrabberCB:
publicISampleGrabberCB
{
//在后面提供的类中具体完成
}
CSampleGrabberCBmCB;
第二步、调用RenderStream依次把Stillpin、SampleGrabber和系统默认RendererFilter连接起来。
第三步、配置SampleGrabber以捕获数据。
视频捕捉类CCaptureVideo的具体实现
//CCaptureVideo视频捕捉类头文件
/////////////////////////////////////////////////////////////////////
#if!
defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_)
#defineAFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_
//CaptureVideo.h:
headerfile
#if_MSC_VER>
1000
#pragmaonce
#endif//_MSC_VER>
#include<
atlbase.h>
windows.h>
dshow.h>
#ifndefSAFE_RELEASE
#defineSAFE_RELEASE(x)\
if(NULL!
=x)\
{\
x->
Release();
\
x=NULL;
#endif
classCSampleGrabberCB;
classCCaptureVideo:
publicCWnd
friendclassCSampleGrabberCB;
public:
voidGrabOneFrame(BOOLbGrab);
HRESULTInit(intiDeviceID,HWNDhWnd);
intEnumDevices(HWNDhList);
CCaptureVideo();
virtual~CCaptureVideo();
private:
HWNDm_hWnd;
IGraphBuilder*m_pGB;
ICaptureGraphBuilder2*m_pCapture;
IBaseFilter*m_pBF;
IMediaControl*m_pMC;
IVideoWindow*m_pVW;
CComPtr<
ISampleGrabber>
m_pGrabber;
protected:
voidFreeMediaType(AM_MEDIA_TYPE&
mt);
boolBindFilter(intdeviceId,IBaseFilter**pFilter);
voidResizeVideoWindow();
HRESULTSetupVideoWindow();
HRESULTInitCaptureGraphBuilder();
};
#endif//!
//-------------------------------------------------------------------
//CCaptureVideo视频捕捉类实现文件CaptureVideo.cpp
//CaptureVideo.cpp:
implementationoftheCCaptureVideoclass.
//
#include"
stdafx.h"
CaptureVideo.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
BOOLbOneShot=FALSE;
//全局变量
publicISampleGrabberCB
longlWidth;
longlHeight;
TCHARm_szFileName[MAX_PATH];
//位图文件名称
CSampleGrabberCB(){
strcpy(m_szFileName,"
c:
\\donaldo.bmp"
);
}
STDMETHODIMP_(ULONG)AddRef(){return2;
}
STDMETHODIMP_(ULONG)Release(){return1;
STDMETHODIMPQueryInterface(REFIIDriid,void**ppv){
if(riid==IID_ISampleGrabberCB||riid==IID_IUnknown){
*ppv=(void*)static_cast<
ISampleGrabberCB*>
(this);
returnNOERROR;
returnE_NOINTERFACE;
}
STDMETHODIMPSampleCB(doubleSampleTime,IMediaSample*pSample){
return0;
STDMETHODIMPBufferCB(doubledblSampleTime,BYTE*pBuffer,longlBufferSize){
if(!
bOneShot)return0;
if(!
pBuffer)returnE_POINTER;
SaveBitmap(pBuffer,lBufferSize);
bOneShot=FALSE;
//创建位图文件
BOOLSaveBitmap(BYTE*pBuffer,longlBufferSize)
HANDLEhf=CreateFile(
m_szFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,
CREATE_ALWAYS,NULL,NULL);
if(hf==INVALID_HANDLE_VALUE)return0;
//写文件头
BITMAPFILEHEADERbfh;
memset(&
bfh,0,sizeof(bfh));
bfh.bfType=’MB’;
bfh.bfSize=sizeof(bfh)+lBufferSize+sizeof(BITMAPINFOHEADER);
bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);
DWORDdwWritten=0;
WriteFile(hf,&
bfh,sizeof(bfh),&
dwWritten,NULL);
//写位图格式
BITMAPINFOHEADERbih;
bih,0,sizeof(bih));
bih.biSize=sizeof(bih);
bih.biWidth=lWidth;
bih.biHeight=lHeight;
bih.biPlanes=1;
bih.biBitCount=24;
bih,sizeof(bih),&
//写位图数据
WriteFile(hf,pBuffer,lBufferSize,&
CloseHandle(hf);
return0;