如何利用摄像头进行视频采集
2014-03-11李琳黑龙江旅游职业技术学院黑龙江哈尔滨150086
李琳黑龙江旅游职业技术学院 黑龙江哈尔滨 150086
如何利用摄像头进行视频采集
李琳黑龙江旅游职业技术学院 黑龙江哈尔滨 150086
视频采集是将电子设备产生的视频信号转变成数字化的信息,然后存储或是进行实时处理的过程。本系统需要从摄像头拍摄的用户面部运动视频中找到面部活动的轨迹,控制鼠标移动的位置,所以捕捉到数字视频是一个关键的过程。
视频采集;VFW技术;DirectShow技术
微软公司提供了两种用来捕捉视频的技术,一种是VFW(Video for Windows),另一种是DirectShow。
DirectShow是微软公司提供的一套在Windows平台上基于COM(Component Object Model)的流媒体处理的开发包。它采用了一种叫Filter Graph的模型来管理整个数据流的处理过程,使我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。
VFW(Video for Windows)也是由Microsoft推出的关于数字视频的一个软件开发包,VFW的核心是AVI(Audio Video Interleave)文件标准。围绕AVI文件,VFW推出了一整套完整的视频采集、压缩、解压缩、回放和编辑的应用程序接口(API),并给程序员提供.VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。
Windows系统安装的时候会自动安装VFW的相关组件,它主要由以下六个功能模块组成,如下说明:
1.AVICAP.DLL:包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动程序提供一个高级接口;
2.MSVIDEO.DLL:用一套特殊的DrawDib函数来处理屏幕上的视频操作;
3.MCIAVI.DRV:此驱动程序包括对VFW的MCI命令的解释器的驱动程序;
4.AVIFILE.DLL:支持由标准多媒体I/O函数提供的更高的命令来访问AVI文件;
5.ICM:压缩管理器,用于管理视频压缩-解压缩的编解码器(CODEC);
6.ACM:音频压缩管理器,提供与ICM相似的服务,不同的是它适于波形音频。
VFW技术与DirectShow技术都可以完成对实时视频的采集。VFW技术的优势在于它支持的软件平台小,不需要专用的设备,运行十分稳定,而且占用的资源较少,可以简单快捷地完成视频采集操作;其缺点是需要手工操作原始数据,容易出错,而且因为这项技术出现较早,对现在的许多媒体格式不支持。DirectShow技术的优势在于是基于COM技术的编程接口,可以使用面向对象的思想进行开发,并且对现在流行的多种媒体也提供了完善的解决方案;其缺点是需要专业的视频采集设备,运行速度慢,想要得到良好的画面质量效果,必须使用硬件辅助。
由于我们对图像质量没有太高的要求,而且需要从简单的USB摄像头中取到视频数据,所以没有采用DirectShow技术,采用VFW技术进行实时视频捕捉。
由上所述,如果要取得电脑USB摄像头拍摄的视频或是图像,只需要在系统画面上创建一个捕捉视频的窗口,通过SendMessage函数,向其发送保存视频或是抓图的消息指令就可以采集到系统需要的视频数据。
详细来说,可以利用V F W软件包中的AV I F I L E.D L L和U S E R.D L L函数来捕捉摄像头中的视频数据,首先用capCreateCaptureWindow()函数创建一个捕捉视频的窗口,这个函数返回一个窗口句柄,这个句柄就是捕获窗口的句柄,后面其他操作如指定视频设备,中止、指定帧速度等就是利用SendMessage()函数发送消息指令给该句柄来实现。函数说明如下所示:
1. capCreateCaptureWindow()函数,用来创建一个捕捉视频的窗口,如下说明:
[DllImport("avicap32.dll")]
private static extern int capCreateCaptureWindow( string strWindowName, int dwStyle, int x, int y ,int width, int height , int hwdParent, int nID );
参数说明如下:
●strWindowName:标识窗口的名称;
●dwStyle:标识窗口的风格;
●x,y:标识窗口左上角的坐标;
●width,height:标识窗口的宽度和高度;
●hwdParent:标识父窗口的句柄;
●nID:标识窗口的ID;返回值:视频捕捉窗口的句柄。
2. SendMessage()函数,用来向视频窗口发送消息指令。
[DllImport("user32.dll")]
private static extern int SendMessage( int hwnd , int wMsg, int wParam , int lParam );
参数说明如下:
●
●hwnd:标识窗口的名称;
●wMsg:要发送的消息;wParam,lParam:两个消息的参数;
视频获取的核心代码如下所示:
●
()()