摄像头图像采集程序与分析资料.docx
- 文档编号:23123630
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:32
- 大小:25.47KB
摄像头图像采集程序与分析资料.docx
《摄像头图像采集程序与分析资料.docx》由会员分享,可在线阅读,更多相关《摄像头图像采集程序与分析资料.docx(32页珍藏版)》请在冰豆网上搜索。
摄像头图像采集程序与分析资料
打开摄像头:
caseIDM_OPENCAMERA:
if(capDriverConnect(hwndCap,0)==TRUE)
{
capDriverGetCaps(hwndCap,&CapDriver,sizeof(CAPDRIVERCAPS));
if(CapDriver.fHasOverlay)
capOverlay(hwndCap,TRUE);
else
{
capPreviewRate(hwndCap,66);
capPreview(hwndCap,TRUE);
}
}
else{
MessageBox(hwndCap,"打开摄像头错误!
\n确定摄像头是否已连接","错误
",MB_OK);
}break;
//采集,捕捉摄像头单帧图像
caseIDM_CAPTUREIMG:
capGrabFrame(hwndCap);
break;
//保存摄像头采集的图片
caseIDM_CAPIMGSAVE:
MenuOpenDlg(hwnd,"视频采集保存对话框","save");
capFileSaveDIB(hwndCap,TempName);
break;
//VideoCapture.cpp
#include
#include
#include
#include
#include"VideoCapture.h"
#include"resource.h"
charTempName[256];
HWNDhwndCap;
HWNDhwndSetCapStutas;
CAPDRIVERCAPSCapDriver;
CAPSTATUSCapStat;
2/17
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTR
lpCmdLine,intnShowCmd)
{
if(DialogBox(hInstance,(LPCSTR)IDD_DIALOG1,NULL,DlgProc)==-1)
MessageBox(NULL,"对话框建立错误!
","错误",MB_OK);
return0;
}
BOOLCALLBACKDlgProc(HWNDhdlg,UINTmessage,WPARAMwParam,LPARAM
lParam)
{
RECTrect;
switch(message)
{
caseWM_INITDIALOG:
GetWindowRect(hdlg,&rect);
hwndCap=capCreateCaptureWindow("人脸录入",WS_CHILD|
WS_VISIBLE,30,20,320,240,hdlg,0);
returnFALSE;
caseWM_COMMAND:
switch(LOWORD(wParam))
{
caseIDOK:
if(capDriverConnect(hwndCap,0)==TRUE)
{
capDriverGetCaps(hwndCap,&CapDriver,sizeof(CAPDRIVERCAPS));
if(CapDriver.fHasOverlay)
capOverlay(hwndCap,TRUE);
else
{
capPreviewRate(hwndCap,66);
capPreview(hwndCap,TRUE);
}
}
else
MessageBox(hdlg,"采集图像错误","提示",MB_OK);
return0;
break;
caseIDC_BUTTON1:
3/17
if(CapDriver.fHasDlgVideoSource)
capDlgVideoSource(hwndCap);
break;
caseIDC_BUTTON2:
MessageBox(hdlg,"作者:
Steward\n地址:
云南大学信息学院","关于作者",MB_OK);
break;
caseIDC_BUTTON3:
capGrabFrame(hwndCap);
break;
caseIDC_BUTTON4:
MenuOpenDlg(hdlg,"视频采集保存对话框");
capFileSaveDIB(hwndCap,TempName);
break;
caseIDCANCEL:
capCaptureStop(hwndCap);
capDriverDisconnect(hwndCap);
EndDialog(hdlg,0);
returnTRUE;
}
break;
}
returnFALSE;
}
voidMenuOpenDlg(HWNDhWnd,char*str1)
{
OPENFILENAMEOpenTemp;
DWORDErrval,error;
charbuf[5];
charErrstr[50]="GetOpenFileNamereturnedError#";
charszTemp[]="BMP文件(*.bmp;*.BMP)\0*.bmp\0所有文件(*.*)\0*.*\0";
OpenTemp.lStructSize=sizeof(OPENFILENAME);
OpenTemp.hwndOwner=hWnd;
OpenTemp.hInstance=0;
OpenTemp.lpstrFilter=(LPSTR)szTemp;
OpenTemp.lpstrCustomFilter=NULL;
OpenTemp.nMaxCustFilter=0;
OpenTemp.nFilterIndex=1;
OpenTemp.lpstrFile=(LPSTR)TempName;
OpenTemp.nMaxFile=sizeof(TempName);
OpenTemp.lpstrFileTitle=NULL;
OpenTemp.nMaxFileTitle=0;4/17
OpenTemp.lpstrInitialDir=NULL;
OpenTemp.lpstrTitle=str1;
OpenTemp.Flags=OFN_FILEMUSTEXIST|
OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
OpenTemp.nFileOffset=0;
OpenTemp.nFileExtension=0;
OpenTemp.lpstrDefExt="*";
OpenTemp.lCustData=0L;
OpenTemp.lpfnHook=NULL;
OpenTemp.lpTemplateName=NULL;
error=0;
if(GetSaveFileName(&OpenTemp)!
=TRUE)
error=1;
if(error==1){
Errval=CommDlgExtendedError();
if(Errval!
=0){
sprintf(buf,"%ld",Errval);
strcat(Errstr,buf);
MessageBox(hWnd,Errstr,"WARNING",MB_OK|MB_ICONSTOP);
}
}
InvalidateRect(hWnd,NULL,TRUE);
}
//资源文件
//Dialog
//
IDD_DIALOG1DIALOGDISCARDABLE0,0,203,201
STYLEDS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
CAPTION"视频采集"
FONT10,"System"
BEGIN
DEFPUSHBUTTON"打开",IDOK,31,143,39,14
PUSHBUTTON"退出",IDCANCEL,140,169,37,15
PUSHBUTTON"设置",IDC_BUTTON1,140,142,38,14
PUSHBUTTON"帮助",IDC_BUTTON2,84,170,38,14
PUSHBUTTON"捕捉图像",IDC_BUTTON3,85,142,38,15
PUSHBUTTON"保存图像",IDC_BUTTON4,32,170,37,14
END
//DESIGNINFO5/17
GUIDELINESDESIGNINFODISCARDABLE
BEGIN
IDD_DIALOG1,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,196
TOPMARGIN,7
BOTTOMMARGIN,194
END
END
实现原理
用AVICAP.DLL实现图像采集,首先要用函数capCreateCaptureWindowA创建一个视频
采集窗口,然后向视频采集窗口发送相应的消息,实现视频设备的连接、回调函数设置、预
览比例和速率设置、预览和叠加模式的设置、图像文件设置等操作。
如果以上操作成功,就
可以通过视频设备采集图像了。
回调函数由程序员编写,用于特殊的视频采集中,例如,在
视频会议中用回调函数将采集的视频和音频实时地传递到远程计算机中。
在VC++中,头文件VFW.H中不仅包含了AVICAP.DLL中函数的原型定义,还定义了
与视频采集有关的数据结构、消息和发送消息的宏。
利用这些函数、数据结构、消息和发送
消息的宏可以方便地编写图像采集程序,如果要对采集的图像实时处理,可以通过编写回调
函数实现。
实例分析
为了说明实现的方法和技巧,采用USB接口的摄像头作为视频采集设备,在VC++6.0
中以实现采集一副图像为例说明。
在VC++6.0中创建一个基于MFC的单文档应用程序,工程名为“Video”,按照以下步
骤完成:
(1)在VideoView.h的首部加入语句:
#include"Vfw.h"
(2)打开“ProjectSettings”对话框,选择“Link”选项卡,在“Object/librarymodules”中输入
“vfw32.lib”。
(3)在VideoView.h中对类CVideoView加入私有成员变量Hwndcap:
private:
//视频采集窗口的句柄
HWNDHwndcap;
(4)在Resources面板中单击“Menu”,双击“IDR_MAINFRAME”,添加菜单项“采集”。
在“采
集”下加入子菜单项“采集图像”和“保存BMP”,它们的ID分别设为“ID_CAP_BMP”和
“ID_SAVE_BMP”。
(5)在MFCClassWizard中,选择“MessageMap”选项卡,在下拉列表框“Classname”中选择6/17
“CVideoView”,在列表框“ObjectIDs”中选择“ID_CAP_BMP”,在列表框“Messages”中选择
“Command”,单击“AddFunction”按钮添加成员函数OnCapBmp(),按照同样方法为
“ID_SAVE_BMP”响应消息“Command”添加成员函数OnSaveBmp()。
再按照同样方法为
“CVideoView”响应消息“WM_SIZE”添加成员函数OnSize()。
(6)在类“CVideoView”的构造函数中加入:
Hwndcap=NULL;
(7)在类“CVideoView”的成员函数OnCapBmp()中加入以下代码:
CRectWRect;
//取得主窗口客户区域的位置和大小
GetClientRect(&WRect);
//创建视频采集窗口
Hwndcap=capCreateCaptureWindow(
(LPSTR)"采集图像",
WS_CHILD|WS_VISIBLE,
0,25,
WRect.Width(),WRect.Height(),
AfxGetMainWnd()->m_hWnd,
(int)0);
if(Hwndcap)
{
//连接视频采集设备
if(capDriverConnect(Hwndcap,0))
{
//设置视频预览图像的大小
capPreviewScale(Hwndcap,1);
//设置视频预览的速率
capPreviewRate(Hwndcap,66);
//设置视频以预览模式显示
capPreview(Hwndcap,1);
}
else
{//显示错误信息
MessageBox("摄像头未准备好!
","提示信息",MB_OK|MB_ICONERROR);
//撤销视频采集窗口
:
:
DestroyWindow(Hwndcap);
Hwndcap=NULL;
}}
(8)在类“CVideoView”的成员函数OnSaveBmp()中加入以下代码:
if(Hwndcap)
//将当前帧保存为位图文件
capFileSaveDIB(Hwndcap,"test.bmp");
else
MessageBox("请先采集图像!
",
"提示信息",7/17
MB_OK|MB_ICONERROR);
(9)在类“CVideoView”的成员函数OnSize()中加入以下代码:
CRectWRect;
//取得主窗口客户区域的位置和大小
GetClientRect(&WRect);
//设置视频采集窗口的位置和大小
:
:
SetWindowPos(Hwndcap,
NULL,
0,25,
WRect.Width(),
WRect.Height(),
SWP_NOZORDER);
以上各步完成后,经过编译和连接生成可执行文件“Video.exe”。
运行“Video.exe”,单击
菜单项“采集/采集图像”,结果如图1所示。
程序中的capDriverConnect等是头文件“Vfw.h”中定义的宏,这些宏实质是向视频采集
窗口发送相应的消息,由于篇幅所限,这里对这些宏和消息的定义不作介绍,读者可参阅
VC++中的头文件“Vfw.h”。
5结束语
在VC++中利用AVICAP.DLL实现图像采集简单,编程代码量少,程序员编写回调函数
可以实现特殊需求的图像采集,不过,对于一般要求的图像采集不需要编写回调函数。
图1程序运行结果
参考文献:
[1]赵军,平西建,肖永隆.视频信号的捕获采集编程[J].信息工程大学学报,2001,2(4):
46-49.
[2]张弋,何晓,李艳军.多媒体信息捕获在Win32编程中的实现[J].计算机工程,2002,28
(2):
205-207.
[3]张元.基于AVICap窗口类的视频监控及捕捉的实现[J].电脑知识与技术,2004,(14):
7-9.
[4]阮林波,曹锦云.基于USB摄像头的自动监控系统[J].计算机工程与设
计,2004,25(6):
988-989.
8/17
前言
DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与
DirectX开发包一起发布。
DirectShow为多媒体流的捕捉和回放提供了强有力的支持。
用
DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,
并且进行相应的后期处理乃至存储到文件中。
DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序
编写的基础知识。
DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构
建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。
编程思路
为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做CaptureGraph
Builder的对象,CaptureGraphBuilder提供IcaptureGraphBuilder2接口,该接口可以建立和
控制CaptureGraph。
建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个
适当的视频捕捉设备。
选择好设备后,为该设备创建Capturefilter,然后调用AddFilter把
Capturefilter添加到FilterGraph。
如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用
ICaptureGraphBuilder2:
:
RenderStream就可以了:
ICaptureGraphBuilder2*pBuild;//CaptureGraphBuilder
//省略初始化部分代码
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__IN
CLUDED_)
#define
AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_
/////////////////////////////////////////////////////////////////////
//CaptureVideo.h:
headerfile
/////////////////////////////////////////////////////////////////////9/17
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include
#include
#include
#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
m_pGrabber;
protected:
voidFreeMediaType(AM_MEDIA_TYPE&mt);
boolBindFilter(intdeviceId,IBaseFilter**pFilter);
voidResizeVideoWindow();
HRESULTSetupVideoWindow();
HRESULTInitCaptureGraphBuilder();
};
#endif
//!
defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INC
LUDED_)
//-------------------------------------------------------------------10/17
//CCa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 摄像头 图像 采集 程序 分析 资料