您的位置:首页 > 运维架构

一个关于OpenCV2.2静态编译时无法用cvCaptureFromFile读取文件的问题

2012-10-05 20:36 579 查看
opencv一般用动态编译,但是为了测试一些小程序也要讲dll全复制到其他电脑上去,非常麻烦。这两天尝试将opencv静态编译,基本都能工作,只是无法通过cvCaptureFromFile读取视频文件。

一开始我以为是编解码库的问题,装了XviD、ffdshow也没见什么效果。而且2.2本来就自带了ffmpeg的一些基本的解码库,百思不得其解。最后只好翻开源码调试,发现在cap_w32.cpp里有这样一句话

ffmpegCapture = icvCreateFileCapture_FFMPEG_p( filename );
运行过程中ffmpegCapture总是0。也就是icvCreateFileCapture_FFMPEG_p这个函数没有返回正常值。接着追踪,发现

icvCreateFileCapture_FFMPEG_p =
(CvCreateFileCapture_Plugin)GetProcAddress(icvFFOpenCV, "cvCreateFileCapture_FFMPEG");


并且
const char* ffopencv_name =
ffopencv_name_m(CV_MAJOR_VERSION,CV_MINOR_VERSION,CV_SUBMINOR_VERSION);

icvFFOpenCV = LoadLibrary( ffopencv_name );


好了,原来icvCreateFileCapture_FFMPEG_p这个函数是指向ffmpeg220.dll里的cvCreateFileCapture_FFMPEG的指针。而且无论opencv是否通过静态编译,它都会去加载这个dll,而通过一般方法制作的静态库当然不会编译出这个dll。所以只能在cmake将shared library勾上,重新编译一个ffmpeg220.dll库。

虽然让人觉得很不方便,而且看上去是个bug,不过官方的解释是ffmpeg的源码都是通过LGPL发布的,如果静态链接ffmpeg会导致highgui也必须按照GPL/LGPL发布,而opencv所有源码都是通过BSD发布的,所以因为许可证的问题只能动态链接。下面是关于这个问题的链接。
https://code.ros.org/trac/opencv/ticket/687
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dll library 测试 工作
相关文章推荐