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

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发布的,所以因为许可证的问题只能动态链接。下面是关于这个问题的链接。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值