转自:http://www.th7.cn/Program/c/201406/220528.shtml
当一个opencv工程实现之后,我们会面临一个问题,怎么把opencv程序的exe在其他电脑上运行,这个问题已经有很多人遇到过,当然也有很多人给出了博客,介绍了具体的解决方法,具体自己操作时,还是遇到了这样或者那样的小毛病,不过凭借自己根据错误提示解决问题的能力,最后还是把静态编译给编译成功了。
本文介绍两种opencv程序移植到其他电脑运行的方法,一种是动态编译,需要拷贝程序运行需要的dll,也就是-个exe跟着多个dll的模式,这种简单粗暴,但是显得拖拖拉拉,一个程序还得跟着那么多其他文件,所以我们很不推荐。另外一种就是本文主要介绍的静态编译,和之前运行不一样,我们在这使用的不是opencv的lib库,而是staticlib,编译成功之后,程序只需要拷贝一个exe,就可以在其他电脑上运行。
另外介绍一下本文测试程序工作的程序配置
操作系统 | Win7 |
IDE | VS2010 |
opencv版本 | opencv2.4.5 |
为了做一个全面的总结,在这简单的介绍opencv动态编译的方法。
opencv动态编译需要两部分dll:
(1)opencv库的dll,检查你所引用的h文件,把对应的dll,拷贝过来就行,注意debug和release的不同,当然一般程序发布的话都会用release版本的,因为release版本比debug版本要快10倍有余。
(2)考虑到目标终端有可能没有装vs,所以需要拷贝msvcp110.dll和msvcr110.dll(release下),dll在C:/Windows/System32下。
静态编译主要的不同就是利用的是H:/Opencv2.4.5/opencv/build/x86/vc11/staticlib文件下的lib,而非H:/Opencv2.4.5/opencv/build/x86/vc11/lib文件夹。具体配置如下:
#include#include using namespace cv;void main(){ cv::Mat image = cv::imread("img1.png"); cv::flip(image,image,1); cv::imwrite("flip.jpg",image);}
视图-》属性管理器-》Debug-》右键-》添加新项目属性表
属性表名称改为PropertySheet_Static_Opencv_debug。
右键属性表-》属性-》VC++目录-》包含目录,然后添加opencv的h文件目录:
库目录里面添加staticlib文件夹目录
然后C/C++-》代码生成-》运行库-》多线程调试(/MTd),
介绍一下这四个选项,多线程(/MT)为静态链接release模式,多线程调试(/MTd)为静态链接debug模式,多线程dll(/MD)为动态链接release模式,多线程调试DLL(/MDd)为动态链接debug模式。
完整的程序如下:
#include最后程序运行会出现很多warning,但是不影响运行,程序大小为7.5M!挺大的,但是一个大程序,总比一个exe跟着多个dll好啊。#include #pragma comment( lib, "IlmImfd.lib")#pragma comment( lib, "libjasperd.lib")#pragma comment( lib, "libjpegd.lib")#pragma comment( lib, "libpngd.lib")#pragma comment( lib, "libtiffd.lib")#pragma comment( lib, "zlibd.lib")#pragma comment( lib, "opencv_core245d.lib")#pragma comment( lib, "opencv_highgui245d.lib")#pragma comment( lib, "vfw32.lib" )#pragma comment( lib, "comctl32.lib" ) using namespace cv;void main(){ cv::Mat image = cv::imread("img1.png"); cv::flip(image,image,1); cv::imwrite("flip.jpg",image);}
原图:
结果图:
转自:http://m.blog.csdn.net/blog/dxsooo/27050729
动态编译的程序脱离OpenCV环境就不能运行,所以就需要静态编译,保证兼容性
下面以静态编译一个MFC、OpenCV程序为例,使用的环境为VS2012
Debug版本:
步骤一:设置MFC编译条件,右键项目,在“常规”中修改,一般是“在共享DLL中使用MFC”,修改为“在静态库中使用MFC”
步骤二:修改运行库,C\C++标签->代码生成;debug下默认原是“MDd”,修改为“MTd”
步骤三:修改附加库目录,修改路径为staticlib
步骤四:修改附加依赖项
需要的库为:(当前使用的OpenCV版本为249)
vfw32.lib
comctl32.lib
zlibd.lib
libjasperd.lib
libjpegd.lib
libpngd.lib
libtiffd.lib
IlmImfd.lib
opencv_core249d.lib
opencv_imgproc249d.lib
opencv_highgui249d.lib
opencv_ml249d.lib
opencv_video249d.lib
opencv_features2d249d.lib
opencv_calib3d249d.lib
opencv_objdetect249d.lib
opencv_contrib249d.lib
opencv_legacy249d.lib
opencv_flann249d.lib
然后可以静态编译。
Release版本:
步骤一同。
步骤二:修改运行库,C\C++标签->代码生成;Release下默认原是“MD”,修改为“MT”
步骤三同。
步骤四:
需要的库为:(即原debug版本的d去掉)
vfw32.lib
comctl32.lib
zlib.lib
libjasper.lib
libjpeg.lib
libpng.lib
libtiff.lib
IlmImf.lib
opencv_core249.lib
opencv_imgproc249.lib
opencv_highgui249.lib
opencv_ml249.lib
opencv_video249.lib
opencv_features2d249.lib
opencv_calib3d249.lib
opencv_objdetect249.lib
opencv_contrib249.lib
opencv_legacy249.lib
opencv_flann249.lib