OpenCV自带摄像头采集接口cvCaptureFromCAM,只需传一个摄像头编号即可调用。但是我用该接口函数一直不能正常捕捉视频,第一次打开失败,后面几次摄像头灯亮了,但是视频画面一片黑,百思不得其解,经过多方查证,可能是OpenCV不支持新摄像头的采集方法。后来尝试用directshow进行采集,directshow+OpenCV采集视频其实早就有人做出来了,我只不过是站在前人的肩膀上而已。网上大部分人都知道用于老师的directshow库结合OpenCV进行采集,但是大部分的directshow提供的下载文件都不全,只有一个cpp文件和一个.h文件,其实整个文件有1M多,我在codeforge上面下载到了一个完整的directshow文件,果然成功了。步骤如下:
操作系统:windows7 64位
OpenCV:1.0
开发环境:vc6.0
原文链接如下
http://www.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F
1. 将CameraDS.h CameraDS.cpp以及目录DirectShow复制到你的项目中
2. 菜单 Project->Settings->Settings for:(All configurations)->C/C++->Category(Preprocessor)->Additional include 设置为 DirectShow/Include
3. 菜单 Project->Settings->Settings for:(All configurations)->Link->Category(Input)->Additional library 设置为 DirectShow/Lib
上面并没有直接使用cvCaptureFromCAM接口,而是使用了封装好的CCameraDS类。
OpenCV里面有一大堆陷阱,一不留神就陷进去了,内存泄漏就是其中一个。OpenCV封装的很多函数都有对应的释放函数,释放函数自然有他的道理,不释放的话势必造成内存泄漏,特别是很明显的那些带create字样的函数尤其要注意调用带release字样的释放函数进行释放。我在一个MFC的视频采集的例子里面发现内存消耗不断增长,但是那些很明显的创建函数都释放了,原来是cvLoad这个函数加载了haar后没有调用cvReleaseHaarClassifierCascade进行释放。其实opencv.org这个网站上面的一些例子也有内存泄漏的风险,只是例子都只是没什么循环的直接推出了不容易看出来。