解码器+OpenCv+DirectShow

来源:互联网 发布:dz论坛源码下载 编辑:程序博客网 时间:2024/04/29 18:17

 最近用OpenCV做图像处理,发现用cvCaptureFromFile打开视频文件时,总是返回空指针。开始以为是参数类型不对,以为一定要用 char *文件名,后来发现就是把文件名转成char *还是不行。然后就到网上查了查,发现很多人都遇到了这个问题。但是其原因所在,却又不同的解释,比较普遍的看法是缺少解码器,并且推荐使用K-Lite Code Pack。

      在GOOGLE上搜索下载安装K-Lite Code Pack后,发现问题解决了。看网上有的人说,安装K-Lite Code Pack后还是不行,还是不能打开视频文件,这个问题目前我也不是很清楚,不知道还有什么别的原因。

      顺便再说一下,cvCaptureFromFile函数原型是cvCaptureFromFile(const char* filename),要求传入的文件名是char *类型,但是其实CString类型也是可以的,我用CFileDlg获取到的文件名也可以正常打开视频文件。

【补充一点,抄来的】openCV里面的cvCaptureFromFile是否只能打开avi格式的?

如果只是做研究,用AviSynth + K-Lite Code Pack来解决这个问题吧。

K-Lite Code Pack里面包括ffdshow,是一套video codec的组合,它提供
Video For Windows 的接口,OpenCV的这个函数就是用这个接口;

然后用AviSynth这个virtual frame server来包装这个mpeg文件,创建一
个简单的script,比如 mobile.avs,里面只有一行:
MpegSource("mobile.mpg")
当然这取决于你的mpeg的文件的压缩方式,也 许需要额外的AviSynth的plugin.
装好K-lite Codec和AviSynth之后,你可以先用播放器直接放这个mobile.avs
文件看是否行得通。

视频实际上的读取过程是:
原始视频 -> ffdshow -> AviSynth -> OpenCV -> IplImage

K-lite Codec Pack主页:http://www.codecguide.com/download_kl.htm 
AviSynth 主页:http://www.avisynth.org/ 
相 关讨论区:http://www.doom9.org/

另外一条路是基于DirectShow filter/sample grabber的办法来读取video frames,
可以看看: http://windowssdk.msdn.microsoft.com/en-us/library/ms787867.aspx 
这 种方法需要下载DirectX SDK和DirectShow的addon,同时也需要相关codec,
视频的读取过程是:
原始视频 -> codec -> DirectShow(frame grabber) -> Windows Bitmap -> IplImage

如果是只做研究用,推荐第一条;如果是商业用途,得要看license来决定了。

原创粉丝点击