转自http://kqwd.blog.163.com/blog/static/412234482010611105013322
OpenCV具有强大的图像处理功能,处理视频也是毫不逊色。只是其自带的HighGUI并非是具有工业强度的模块,不适合最终提供给客户,仅仅是方便程序开发阶段的调试。其中跟视频捕获相关的cvCreateCameraCapture或cvCaptureFromCAM函数可以方便的从摄像头捕获视频,但这两个函数在Windows中都是由较为低效的VFW机制实现的,不适合在最终产品中使用。
在Windows中使用DirectShow可以高效的从摄像头捕获视频,但使用较为复杂。OpenCV中文网的YuShiQi提供了一个基于DirectShow实现的摄像头捕获类,但试用后效果一般,速度并没有明显的提高。
新版的OpenCV(OpenCV 2.0及以后版本)提供了第三方的VideoInput库,该库实现了基于DirectShow的视频捕获,使用方便、功能强大,速度也很快。另外还有一个意外发现——腾讯QQ的视频捕获貌似用的也是这个库哦~~
好了,下面就说说如何使用这个库
如果你的OpenCV版本低于2.0,请先去http://muonics.net/school/spring05/videoInput/
下载VideoInput,我这里需要翻墙才能上去。如果使用2.0及以后版本则自带该库。
首先需要在代码中包含VideoInput的头文件
#include
下面给出一个读取并显示摄像头画面的实例
int
int
IplImage *pRgb=cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);
videoInput video;//创建视频捕获对象
video.setupDevice(0, width, height);//配置设备
video.showSettingsWindow(0);//该语句可以显示视频设置窗口,可以去掉
while(1)
{
}
有朋友提出编译时可能会遇到如下错误:
"fatal error LNK1104: cannot open file 'atlthunk.lib'"
如果遇到此错误,请在文件的开头加入如下语句:
#pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")
这个类库还提供了非常强大的功能,具体函数可以查看videoInput.h头文件。下面附上videoInput类的共有成员函数列表和相关说明。
//turns off console messages - default is to print messages
static
//Functions in rough order they should be used.
static
//needs to be called after listDevices - otherwise returns NULL
static
//choose to use callback based capture - or single threaded
void
//call before setupDevice
//directshow will try and get the closest possible framerate to what is requested
void
//some devices will stop delivering frames after a while - this method gives you the option to try and reconnect
//to a device if videoInput detects that a device has stopped delivering frames.
//you MUST CALL isFrameNew every app loop for this to have any effect
void
//Choose one of these four to setup your device
bool
bool
//These two are only for capture cards
//USB and Firewire cameras souldn't specify connection
bool
bool
//If you need to you can set your NTSC/PAL/SECAM
//preference here. if it is available it will be used.
//see #defines above for available formats - eg VI_NTSC_M or VI_PAL_B
//should be called after setupDevice
//can be called multiple times
bool
//Tells you when a new frame has arrived - you should call this if you have specified setAutoReconnectOnFreeze
bool
bool
//Returns the pixels - flipRedAndBlue toggles RGB/BGR flipping - and you can flip the image too
unsigned
//Or pass in a buffer for getPixels to fill returns true if successful.
bool
//Launches a pop up settings window
//For some reason in GLUT you have to call it twice each time.
void
//Manual control over settings thanks.....
//These are experimental for now.
bool
bool
bool
bool
bool
bool
//bool setVideoSettingCam(int deviceID, long Property, long lValue, long Flags = NULL, bool useDefaultValue = false);
//get width, height and number of pixels
int
int
int
//completely stops and frees a device
void
//as above but then sets it up with same settings
bool
//number of devices available
int