在没有安装Opencv的电脑上运行基于Opencv库的程序

来源:互联网 发布:魔法师雾化器数据 编辑:程序博客网 时间:2024/04/30 03:38

在没有安装OpenCV的电脑上,要运行基于OpenCV库的程序,有两种方法:一、动态链接:就是将OpenCv安装目录下的bin目录下的*.dll文件与应用程序一起打包发布;二、静态链接:就是将OpenCV库源代码先用cMake进行编译,然后将opencv库的源文件加到工程中一期编译,也就是说最后生成的可执行文件可以单独运行,不需要OpenCV的动态链接库。


一、首先介绍第一种方法,动态链接,dll调用其中包括隐式调用和显示调用


1 隐式调用一般需要:
声明函数接口的.h文件——include文件夹里的内容
链接动态库的.lib文件——lib文件夹里的内容以及Input->Additional Dependencies添加的XX.lib
动态链接库.dll文件——bin文件夹的内容
这里bin文件夹是在系统环境目录里的,所以执行代码是exe文件可以找到。也可以添加在系统文件中,把需要用到的dll拷贝到exe同一个文件夹下即可。
所以,如果把未发布的工程拷贝到没有opencv的电脑上,只要把需要用的函数相关的.h,.lib以及.dll文件考过去即可。

2 另一种调用dll的方式是显示调用。
显示调用是不需要.lib和.h文件的。是在代码里“显示”加载要用到的函数。例如:
HINSTANCE hDLL=NULL;//生命DLL句柄  
hDLL=LoadLibrary("opencv_core242d.dll");  //加载DLL
HMAT myImread=(HMAT)GetProcAddress(hDLL,"imread");  //使用DLL中的函数
这样在拷贝工程时只拷贝用到的DLL文件就可以。
但这样代码写得很麻烦,DLL换个名字版本之类的要改很多地方,一般用得不多。

如果只是给别人静态链接的exe程序(比如一个demo,不用跑程序),那只要给别人dll文件就可以。
也就是将需要用到的dll文件拷到exe文件夹下即可,Release拷贝XX.dll,Debug版本拷贝XXd.dll
(所以我们写Additional Dependencies不用到的尽量不写,这样拷的dll会少一些~)

二 再一种方法就是楼上提到的把OpenCV的源码一起编译到可执行文件中。
这样就不用拷贝dll文件,只是生成的exe会比较大,具体方法为:

以HMMDemo为例
1、将OpenCv安装目录下的cv、cvaux、otherlibs/highgui三个目录复制到你的工程目录下,再在工程目录下新建一个camera目录,将安装目录下的apps/Common目录中的两个文件复制至camera目录中。
2、在集成开发环境的项目管理窗口中(FileView)新建六个文件夹,分别为highgui_src,highgui_include,cvaux_include,cvaux_src,cv_include,cv_src
3、将项目管理窗口中Source Files中的Camera.cpp(如果有的话)及Header Files中的Camera.h(如果有的话)的路径改为工程目录下的camera目录。
4、在项目管理窗口中右击cv_include项,选择Add Files to Folder...,将第1步中已复制至工程目录下的cv目录下的include目录中的.h文件添加到该项目管理文件夹中。接着按相同做法将cv目录下的src目录中的.cpp文件添加到cv_src项目管理文件夹中。对cvaux_include、cvaux_src,highgui_include,highgui_src亦如此操作。两点注意,第一是工程目录下的highgui目录下不再分include和src,但操作相同;第二是为cvaux_src添加.cpp文件时不要添加cvaux.cpp,因为这个文件包括了cv.h,链接时会有重复定义的错误。
5、右击cv_src,选择Setting...,选择C/C++页,在Category选择Precompiled Headers,再选择下面四个单选项中的第一项”Not using precompiled headers”。这样做的目的是不使用编译头文件,否则会产生“找不到文件结尾”的错误。也可以在每个.cpp文件的开头加入include ”stdafx.h”,但显然没有更改一个选项来得方便。对cvaux_src及highgui_src也进行相同操作。
6、为工程的编译编译选项(Project->Settings...->C/C++)增加/Zm200,作用是增加堆栈的最大限制,因为cvaux_src中有个文件用到了一个很大的常数数组,200不够大的可以300,400......。
7、在Project->Settings...->C/C++中,选择Category中的Preprocessor项,把Additional include directories改为cv/include,cv/src,highgui,camera,cvaux/include,cvaux/src
8、Project->Settings...->Link,如果Object/library modules中有cv.lib,cvaux.lib,highgui.lib,删除之。注意cvd.lib为Debug版,cv.lib为Release版。
9、Project->Settings...->General,将Output directories下的两个框改为Debug,这个是中间文件(.obj等)的输出目录。Project->Settings...->Link,将Output file name改为Debug/XXX.exe,这个是最终可执行文件的输出目录。
好了,你的项目已经可以脱离OpenCV安装环境编译了,编译出来的程序也可以脱离OpenCV的动态链接库运行了

原创粉丝点击