摄像头图像采集程序与分析资料.docx

上传人:b****2 文档编号:671499 上传时间:2023-04-29 格式:DOCX 页数:32 大小:25.47KB
下载 相关 举报
摄像头图像采集程序与分析资料.docx_第1页
第1页 / 共32页
摄像头图像采集程序与分析资料.docx_第2页
第2页 / 共32页
摄像头图像采集程序与分析资料.docx_第3页
第3页 / 共32页
摄像头图像采集程序与分析资料.docx_第4页
第4页 / 共32页
摄像头图像采集程序与分析资料.docx_第5页
第5页 / 共32页
摄像头图像采集程序与分析资料.docx_第6页
第6页 / 共32页
摄像头图像采集程序与分析资料.docx_第7页
第7页 / 共32页
摄像头图像采集程序与分析资料.docx_第8页
第8页 / 共32页
摄像头图像采集程序与分析资料.docx_第9页
第9页 / 共32页
摄像头图像采集程序与分析资料.docx_第10页
第10页 / 共32页
摄像头图像采集程序与分析资料.docx_第11页
第11页 / 共32页
摄像头图像采集程序与分析资料.docx_第12页
第12页 / 共32页
摄像头图像采集程序与分析资料.docx_第13页
第13页 / 共32页
摄像头图像采集程序与分析资料.docx_第14页
第14页 / 共32页
摄像头图像采集程序与分析资料.docx_第15页
第15页 / 共32页
摄像头图像采集程序与分析资料.docx_第16页
第16页 / 共32页
摄像头图像采集程序与分析资料.docx_第17页
第17页 / 共32页
摄像头图像采集程序与分析资料.docx_第18页
第18页 / 共32页
摄像头图像采集程序与分析资料.docx_第19页
第19页 / 共32页
摄像头图像采集程序与分析资料.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

摄像头图像采集程序与分析资料.docx

《摄像头图像采集程序与分析资料.docx》由会员分享,可在线阅读,更多相关《摄像头图像采集程序与分析资料.docx(32页珍藏版)》请在冰点文库上搜索。

摄像头图像采集程序与分析资料.docx

摄像头图像采集程序与分析资料

打开摄像头:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2