【OpenCV】在没有安装OpenCV的电脑运行OpenCV程序
题目来自OpenCV·China的每周一练:
我们在做项目时,通常需要把依赖于opencv,vs(例如vs2005),或者vc(例如vc6.0)的程序,在没有安装相关环境的电脑上去运行。那么现在有哪些方法可以摆脱这些依赖?(提供可行建议即可得10分)
http://www.opencvchina.com/thread-1368-1-1.html
前面的童鞋讲得很全了,我再补充一下自己的理解~
OpenCV的安装
我们下载的OpenCV安装包一般包括源码,示例,文档和编译好的动态链接库(以前OpenCV可能需要自己编译一遍,OpenCV2.3.1之后都有一个build的文件夹,有编译好的mingw,vc9和vc10的版本)。
我们写代码如果调用OpenCV的函数,需要添加附加依赖项:
IncludeDirectories:C:\OpenCV\OpenCV-2.4.2\build\include
LibraryDiractories:C:\OpenCV\OpenCV-2.4.2\build\x86\vc10\lib
然后还需要在Linker->Input->AdditionalDependencies里添加会用到的各种XX.lib,XXd.lib
还有把两个bin文件夹:
C:\OpenCV\OpenCV-2.4.2\build\x86\vc10\bin
C:\OpenCV\OpenCV-2.4.2\build\common\tbb\ia32\vc10
添加到系统环境目录
有的安装教程里还会教我们在SourceDirectories添加OpenCV的源码文件,其实是不需要的。因为实际调用OpenCV里的函数是用的dll的隐式调用方式。
DLL调用
隐式调用一般需要:
声明函数接口的.h文件——include文件夹里的内容
链接动态库的.lib文件——lib文件夹里的内容以及Input->AdditionalDependencies添加的XX.lib
动态链接库.dll文件——bin文件夹的内容
这里bin文件夹是在系统环境目录里的,所以执行代码是exe文件可以找到。也可以添加在系统文件中,把需要用到的dll拷贝到exe同一个文件夹下即可。
所以,如果把未发布的工程拷贝到没有opencv的电脑上,只要把需要用的函数相关的.h,.lib以及.dll文件考过去即可。
另一种调用dll的方式是显示调用:
显示调用是不需要.lib和.h文件的,只会用到dll文件。
但需要在代码里“显示”加载要用到的函数。例如:
HINSTANCE hDLL=NULL;//生命DLL句柄 hDLL=LoadLibrary("opencv_core242d.dll"); //加载DLL HMAT myImread=(HMAT)GetProcAddress(hDLL,"imread"); //使用DLL中的函数
这样在拷贝工程时只拷贝用到的DLL文件就可以。
但这样代码写得很麻烦,DLL换个名字版本之类的要改很多地方,一般用得不多。
静态编译的exe程序
如果只是给别人静态链接的exe程序,比如一个demo,不用跑程序。
最常用的方法就是一起拷贝exe和dll文件到目标电脑:
也就是将需要用到的dll文件拷到exe文件夹下即可,Release拷贝XX.dll,Debug版本拷贝XXd.dll
(所以我们写Additional Dependencies不用到的尽量不写,这样拷的dll会少一些~)再一种方法就是楼上提到的把OpenCV的源码一起编译到可执行文件中。
这种需要在写代码时把OpenCV的源文件加入到工程中。也就是用到的.cpp文件目录添加到Source Directories项中。编译头文件可能会遇到"找不到文件结尾”之类的错误,在项目属性Category中选择"Precompiled Headers"和"Not using precompiled headers"即可。
这样工程不是调用的OpenCV编译过的dll文件,而是把OpenCV当成你自己写的文件一样一起编译。
在没有安装OpenCV的电脑上只用拷贝最终的exe文件即可。不需要dll文件,只是生成的exe会比较大~