对于这个问题,有两个方法:
1. 使用动态库,讲工程所需的.lib,.dll,.h等和工程.exe一起拷到另一台电脑上运行。
2.使用静态库,讲工程需要的.lib直接编译进.exe中,这时的.exe会比方法1中的大很多,但是此时只需要拷贝一个.exe就可以在另一台电脑上运行了。
二、如何将.lib编译进.exe中?
注意这里的.lib是静态链接库,与动态链接库的引导库.lib不同(动态链接库.dll需要有一个.lib作为引导库)。
将.lib编译进.exe中的第一步是编译OpenCV的静态库.lib。具体的编译方法可以参考:OpenCV - 编译静态OpenCV库(静态库)
生成OpenCV的静态库后,就可以进行第二步了。
1,将相应的静态库配置到工程中。
2,配置属性-〉MFC的使用:设置为 在静态库中使用 MFC
3,配置属性-〉C/C++ -〉代码生成-〉运行库 :设置为 多线程 (/MT)。
在VC(2005以上)中有四种运行库:Multi-threaded(/MT)、Multi-threaded-Debug(/MTD)、Multi- threaded-dll(/MD)、Multi-threaded-debug-dll(/MDD):前两个是静态类型库,提供的函数会被链接到程序中;后两个是动态库,会以动态链接库的形式提供函数给程序调用。
设置完之后,生成的.exe就可以直接使用了。
该部分可参考:OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住
三、补充
1, 其实在安装和编译OpenCV后,其本身已经包含了静态库,在 \build\x86\vc10\staticlib 和\build\x64\vc10\staticlib 路径下,所以本文的使用CMake 编译静态库可以省略掉。
2。按照 二 中的步骤生成.exe运行,发现读取视频不成功。原因是OpenCV的视频解码等处理是基于ffmpeg,而OpenCV仅仅提供了ffmpeg的动态链接库 opencv_ffmpeg***.dll,悉知并没有其静态链接库,即使是使用CMake也不能生成(勾选WITH_FFMPEG也不行)。
所以如果想让视频读取成氏衫功,该.exe需要一个.dll支持,即opencv_ffmpeg***.dll。
3。编译ffmpeg静态库的方法可以参考:MinGW下编译ffmpeg静态库给Visual C++使用
按照该方法可以编译出一堆.a文件,即ffmpeg的静态库。这些.a文件的调用具有一定的顺序。
但是我按照文中方法设置后依然无法打开视频。
同时我注意到,OpenCV中也有类似的文件,存放于 \opencv\3rdparty\include\ffmpeg_ 及opencv\3rdparty\lib 中,料想就是ffmpeg的静态库,但是设置后依然无法打开视频。
所以,万不得已,最后的方法还是加入一个.dll支持,即opencv_ffmpeg***.dll。
4。针对文章睁核消:OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 中提到的videoInput.lib,我始终都没有找到,料想是版本的不同吧。
可能原因:
如果OpenCV以前用的时候没有问题的,后来系统备核升级之后就有问题了,很可能是系统升级造成的这个问题。
解决方法:
将缺失的动态链接敏闷库添加到路径C:\Windows\System32或者C:\Windows\SysWOW64
这样就不用每次将动仿拿掘态链接库放到工程所在的文件夹下了。
1.OpenCV确实是在运行时自动加载这些优化库, 不需要运行cvUseOptimized()函数, 前提是库的相关路径注册了环境变量(之前我没注册, 所以没有加载成功).可运行如下程序进行检验:
const char* opencv_libraries = 0
const char* addon_modules = 0
cvGetModuleInfo( 0, &opencv_libraries,&addon_modules )
printf( "OpenCV: %s\\r\\nAdd-on Modules: %s\\r\\n."戚裂世, opencv_libraries, addon_modules)
如果自动加载成功会输出:
OpenCV: cxcore: 1.0.0, cv: 1.0.0
Add-on Modules: ippcv-5.1.dll, ippi-5.1.dll, ipps-5.1.dll, ippvm-5.1.dll, ippcc-5.1.dll, mkl_p4.dll
此时再运行cvUseOptimized(1), 通过查看返回值, 可以知道有多少个函数被优化。
2.不同函数优化的程度不一。
用几个函数测试了一下加载优化库后的源顷优化程度:
系统: P4(2.6G) 512MB XP VC6
测试图像: 768×576 8UC1
循环100次
测试函数 cvSmooth(CV_GAUSSIAN,31*31) 2493ms(with IPP) 5498ms(without IPP)
测试函数 cvSobel(7*7)1674ms(with IPP) 1672ms(without IPP)
测试函数 cvCanny(3*3)2901ms(with IPP) 3385ms(without IPP)
可以看出不同函数优化的程度不一样, cvSmooth优化程度很高, 性能提升50%多, cvSobel基本没有变化, 网上有的老外还说用了IPP之后速度下降了 .
所以究竟用不用IPP(199美元呢), 还得各位测试一下自己的程序高肢, 好在现在还有Evaluation版的IPP可以用。要是OpenCV下个版本能提供一份儿各个函数优化表就好了.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)