论文部分内容阅读
摘要:图像采集是图像处理中比较关键的技术,在图像处理、计算机视觉和视频技术中有着重要的应用。通过具体的实例,阐述了在VC++中利用AVICAP.DLL实现图像采集的方法和技巧。
关键词:VC++;AVICAP.DLL;图像采集
中图分类号:TP391文献标识码:A文章编号:1009-3044(2007)16-31133-02
Realizing Image Acquisition with AVICAP.DLL in VC++
REN Minlgj-hong
(Department of Computer Science & Technology,Shanxi University of Technology, Hanzhong 723003,China)
Abstract:Image acquisition is very critical technology in image processing.It has important applications in image processing, computer vision and video technology. In this paper,some skills and method of realizing image acquisition with AVICAP.DLL in VC++ are described by the example.
Key words:VC++;AVICAP.DLL;image acquisition
在当今社会,图像处理有着广泛的应用,智能交通系统、停车场智能收费系统、机器人等都离不开图像处理。图像采集是图像处理中比较关键的技术,也是图像处理中重要的一个步骤,只有经过图像采集,图像处理才能得到处理对象。
1 AVICAP.DLL
AVICAP.DLL是微软公司提供的用于视频采集的动态链接库文件,其中定义了视频采集的函数。AVICAP.DLL支持实时的视频流采集和单帧采集并提供对视频源的控制。利用AVICAP.DLL可以方便地编写视频和图像采集程序。
在AVICAP.DLL中定义了如下的接口函数:
(1)创建视频采集窗口函数
HWND WINAPI capCreateCaptureWindowA (
LPCSTR lpszWindowName,
DWORD dwStyle,
int x, int y, int nWidth,
int nHeight,
HWND hwndParent, int nID);
其中,参数lpszWindowName指明窗口的名称,参数dwStyle指明窗口的风格,参数x、y、nWidth和nHeight指明窗口的位置和大小,参数hwndParent指明父窗口的句柄,参数nID指明窗口标识。
在AVICAP.DLL中还定义了一个创建视频采集窗口函数,是capCreateCaptureWindowW,其函数原型与capCreateCaptureWindowA相同,它们的区别是前一个函数用于ANSI字符编码方式下,而后一个函数用于UNICODE字符编码方式下。在头文件VFW.H中用条件编译和宏定义统一为capCreateCaptureWindow。
(2)取得视频采集设备描述信息函数
BOOL WINAPI capGetDriverDescriptionA (UINT wDriverIndex,LPSTR lpszName,
int cbName,LPSTR lpszVer, int cbVer);
其中,参数wDriverIndex指明设备的索引号,参数lpszName指明设备的名称缓冲区的地址,参数cbName指明设备的名称缓冲区的大小,参数lpszVer指明设备的描述缓冲区的地址,参数cbVer指明设备的描述缓冲区的大小。
同样,在AVICAP.DLL中还定义了一个取得视频采集设备描述信息函数,是capGetDriverDescriptionW,它们的区别也是使用于不同的编码方式下。在头文件VFW.H中统一为capGetDriverDescription。
2 实现原理
用AVICAP.DLL实现图像采集,首先要用函数capCreateCaptureWindowA创建一个视频采集窗口,然后向视频采集窗口发送相应的消息,实现视频设备的连接、回调函数设置、预览比例和速率设置、预览和叠加模式的设置、图像文件设置等操作。如果以上操作成功,就可以通过视频设备采集图像了。回调函数由程序员编写,用于特殊的视频采集中,例如,在视频会议中用回调函数将采集的视频和音频实时地传递到远程计算机中。
在VC++中,头文件VFW.H中不仅包含了AVICAP.DLL中函数的原型定义,还定义了与视频采集有关的数据结构、消息和发送消息的宏。利用这些函数、数据结构、消息和发送消息的宏可以方便地编写图像采集程序,如果要对采集的图像实时处理,可以通过编写回调函数实现。
3 实例分析
为了说明实现的方法和技巧,笔者采用USB接口的摄像头作为视频采集设备,在VC++6.0中以实现采集一副图像为例说明。
在VC++6.0中创建一个基于MFC的单文档应用程序,工程名为“Video”,按照以下步骤完成:
(1)在VideoView.h的首部加入语句:
#include "Vfw.h"
(2)在VideoView.h中对类CVideoView加入私有成员变量Hwndcap:
private:
//视频采集窗口的句柄
HWND Hwndcap;
(3)在Resources面板中单击“Menu”,双击“IDR_MAINFRAME”,添加菜单项“采集”。在“采集”下加入子菜单项“采集图像”和“保存BMP”,它们的ID分别设为“ID_CAP_BMP”和“ID_SAVE_BMP”。
(4)在MFC ClassWizard中,选择“Message Map”选项卡,在下拉列表框“Class name”中选择“CVideoView”,在列表框“Object IDs”中选择“ID_CAP_BMP”,在列表框“Messages”中选择“Command”,单击“Add Function”按钮添加成员函数OnCapBmp(),按照同样方法为“ID_SAVE_BMP”响应消息“Command”添加成员函数OnSaveBmp()。再按照同样方法为“CVideoView”响应消息“WM_SIZE” 添加成员函数OnSize()。
(5)在类“CVideoView”的构造函数中加入:
Hwndcap=NULL;
(6)在类“CVideoView”的成员函数OnCapBmp()中加入以下代码:
CRect WRect;
//取得主窗口客户区域的位置和大小
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;
}}
(7)在类“CVideoView”的成员函数OnSaveBmp ()中加入以下代码:
if(Hwndcap)
//将当前帧保存为位图文件
capFileSaveDIB(Hwndcap,"test.bmp");
else
MessageBox("请先采集图像!",
"提示信息",
MB_OK|MB_ICONERROR);
(8)在类“CVideoView”的成员函数OnSize ()中加入以下代码:
CRect WRect;
//取得主窗口客户区域的位置和大小
GetClientRect(&WRect);
//设置视频采集窗口的位置和大小
::SetWindowPos(Hwndcap,
NULL,
0,25,
WRect.Width(),
WRect.Height(),
SWP_NOZORDER);
(9)打开“Project Settings”对话框,选择“Link”选项卡,在“Object/library modules”中输入“vfw32.lib”。
以上各步完成后,经过编译和连接生成可执行文件“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.
关键词:VC++;AVICAP.DLL;图像采集
中图分类号:TP391文献标识码:A文章编号:1009-3044(2007)16-31133-02
Realizing Image Acquisition with AVICAP.DLL in VC++
REN Minlgj-hong
(Department of Computer Science & Technology,Shanxi University of Technology, Hanzhong 723003,China)
Abstract:Image acquisition is very critical technology in image processing.It has important applications in image processing, computer vision and video technology. In this paper,some skills and method of realizing image acquisition with AVICAP.DLL in VC++ are described by the example.
Key words:VC++;AVICAP.DLL;image acquisition
在当今社会,图像处理有着广泛的应用,智能交通系统、停车场智能收费系统、机器人等都离不开图像处理。图像采集是图像处理中比较关键的技术,也是图像处理中重要的一个步骤,只有经过图像采集,图像处理才能得到处理对象。
1 AVICAP.DLL
AVICAP.DLL是微软公司提供的用于视频采集的动态链接库文件,其中定义了视频采集的函数。AVICAP.DLL支持实时的视频流采集和单帧采集并提供对视频源的控制。利用AVICAP.DLL可以方便地编写视频和图像采集程序。
在AVICAP.DLL中定义了如下的接口函数:
(1)创建视频采集窗口函数
HWND WINAPI capCreateCaptureWindowA (
LPCSTR lpszWindowName,
DWORD dwStyle,
int x, int y, int nWidth,
int nHeight,
HWND hwndParent, int nID);
其中,参数lpszWindowName指明窗口的名称,参数dwStyle指明窗口的风格,参数x、y、nWidth和nHeight指明窗口的位置和大小,参数hwndParent指明父窗口的句柄,参数nID指明窗口标识。
在AVICAP.DLL中还定义了一个创建视频采集窗口函数,是capCreateCaptureWindowW,其函数原型与capCreateCaptureWindowA相同,它们的区别是前一个函数用于ANSI字符编码方式下,而后一个函数用于UNICODE字符编码方式下。在头文件VFW.H中用条件编译和宏定义统一为capCreateCaptureWindow。
(2)取得视频采集设备描述信息函数
BOOL WINAPI capGetDriverDescriptionA (UINT wDriverIndex,LPSTR lpszName,
int cbName,LPSTR lpszVer, int cbVer);
其中,参数wDriverIndex指明设备的索引号,参数lpszName指明设备的名称缓冲区的地址,参数cbName指明设备的名称缓冲区的大小,参数lpszVer指明设备的描述缓冲区的地址,参数cbVer指明设备的描述缓冲区的大小。
同样,在AVICAP.DLL中还定义了一个取得视频采集设备描述信息函数,是capGetDriverDescriptionW,它们的区别也是使用于不同的编码方式下。在头文件VFW.H中统一为capGetDriverDescription。
2 实现原理
用AVICAP.DLL实现图像采集,首先要用函数capCreateCaptureWindowA创建一个视频采集窗口,然后向视频采集窗口发送相应的消息,实现视频设备的连接、回调函数设置、预览比例和速率设置、预览和叠加模式的设置、图像文件设置等操作。如果以上操作成功,就可以通过视频设备采集图像了。回调函数由程序员编写,用于特殊的视频采集中,例如,在视频会议中用回调函数将采集的视频和音频实时地传递到远程计算机中。
在VC++中,头文件VFW.H中不仅包含了AVICAP.DLL中函数的原型定义,还定义了与视频采集有关的数据结构、消息和发送消息的宏。利用这些函数、数据结构、消息和发送消息的宏可以方便地编写图像采集程序,如果要对采集的图像实时处理,可以通过编写回调函数实现。
3 实例分析
为了说明实现的方法和技巧,笔者采用USB接口的摄像头作为视频采集设备,在VC++6.0中以实现采集一副图像为例说明。
在VC++6.0中创建一个基于MFC的单文档应用程序,工程名为“Video”,按照以下步骤完成:
(1)在VideoView.h的首部加入语句:
#include "Vfw.h"
(2)在VideoView.h中对类CVideoView加入私有成员变量Hwndcap:
private:
//视频采集窗口的句柄
HWND Hwndcap;
(3)在Resources面板中单击“Menu”,双击“IDR_MAINFRAME”,添加菜单项“采集”。在“采集”下加入子菜单项“采集图像”和“保存BMP”,它们的ID分别设为“ID_CAP_BMP”和“ID_SAVE_BMP”。
(4)在MFC ClassWizard中,选择“Message Map”选项卡,在下拉列表框“Class name”中选择“CVideoView”,在列表框“Object IDs”中选择“ID_CAP_BMP”,在列表框“Messages”中选择“Command”,单击“Add Function”按钮添加成员函数OnCapBmp(),按照同样方法为“ID_SAVE_BMP”响应消息“Command”添加成员函数OnSaveBmp()。再按照同样方法为“CVideoView”响应消息“WM_SIZE” 添加成员函数OnSize()。
(5)在类“CVideoView”的构造函数中加入:
Hwndcap=NULL;
(6)在类“CVideoView”的成员函数OnCapBmp()中加入以下代码:
CRect WRect;
//取得主窗口客户区域的位置和大小
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;
}}
(7)在类“CVideoView”的成员函数OnSaveBmp ()中加入以下代码:
if(Hwndcap)
//将当前帧保存为位图文件
capFileSaveDIB(Hwndcap,"test.bmp");
else
MessageBox("请先采集图像!",
"提示信息",
MB_OK|MB_ICONERROR);
(8)在类“CVideoView”的成员函数OnSize ()中加入以下代码:
CRect WRect;
//取得主窗口客户区域的位置和大小
GetClientRect(&WRect);
//设置视频采集窗口的位置和大小
::SetWindowPos(Hwndcap,
NULL,
0,25,
WRect.Width(),
WRect.Height(),
SWP_NOZORDER);
(9)打开“Project Settings”对话框,选择“Link”选项卡,在“Object/library modules”中输入“vfw32.lib”。
以上各步完成后,经过编译和连接生成可执行文件“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.