利用Cmake编译Opencv3.3.0并将build文件引入vs2010工程,以实现项目可以在无需配置opencv环境的新机器上正常运行。
任务需求:
1.根据所需运行环境重新编译opencv源代码,比如不同操作系统(包括x86x64等)、不同VS版本等需求;
2.实现opencv库的一次性配置,避免重复针对不同环境查找添加运行库DLL和静待库LIB的操作;
3.实现项目迁移之后,不需要重新安装或配置opencv运行环境的情况,打开exe应用程序就可以运行。
实现思路:
1.下载opencv源码:https://opencv.org/releases/
注意对应版本,这里使用windows版本的,下载完成之后直接运行,extract得到一个opencv文件夹,其中的sources就是后边要用到的。
新建文件夹opencv_build用于存放编译后的内容。
下载与上边对应版本(比如前边的3.4.6)的opencv_contrib:https://github.com/opencv/opencv_contrib/releases 并解压。
2.下载安装cmake并安装,这里就不多说了,自行百度。
3.打开cmake,如下图所示,选择源码位置,即第一步的sources位置,选择build位置,即第一步创建的opencv_build位置。
点击cmake中的Configure按钮。如下图,下拉单选择vs2010,点击finish,开始漫长等待。
可能会报错,如下图所示之类的,因为编译过程中是需要联网下载一些文件的,但是由于网络或者其他原因连接不到资源造成,可通过查看下方输出框中红色字体部分,查找错误原因,根据自己的原因来解决相应问题,然后重新来到这一步。
找到OPENCV_EXTRA_MODULES_PATH的参数,将其value设置为前边解压的opencv_contrib的路径下的modules子文件夹。这里如果不需要cuda就去掉WITH_CUDA后边的勾。
再次点击configure,等待……直到configure done,点击Generate,然后generate done。
4.进入之前build的opencv_build目录,VS2010打开工程文件OpenCV.sln,根据自己需要选择DEbug版本或者Realease版本。
然后在 解决方案'OpenCV'(128个项目)上右键重新生成解决方案,等待……
一般会报错,比如有118个成功,5个失败等等。大多是因为前边cmake部分没有处理好的遗留问题。
这里说一下我遇到的错误:
“vgg_generated_120.i”: No such file or directory.
“boostdesc_bgm.i”: No such file or directory.
解决办法:将boostdesc_bgm.i、boostdesc_bgm_bi.i、boostdesc_bgm_hd.i、boostdesc_binboost_064.i、boostdesc_binboost_128.i、boostdesc_binboost_256.i、boostdesc_lbgm.i、vgg_generated_120.i、vgg_generated_64.i、vgg_generated_80.i、vg g_generated_48.i这些文件复制到..\opencv_contrib-3.3.0\modules\xfeatures2d\src目录下重现编译即可。(文件来源:https://download.csdn.net/download/u013569930/11286429 需要的私信或评论留下邮箱,邮箱发给你)
还有一个找不到"cuda.h"之类的的错误,好像是因为头文件索引路径找不到该文件,方法很多:改绝对路径或者修改cmakelist中的路径,或者复制到他能找的路径下都可以。
5.至此完成opencv编译工作,接下来将编译后的opencv库引入到我们的工程。
进入之前build的opencv_build目录,将install目录下:
a.将build的下:build\install\include文件夹复制到工程目录下。
b.将build的下:build\install\x86\vc10\lib文件夹复制到工程目录下。
文件夹拷贝到工程目录下,如下:
6. 打开待配置project,项目属性中实现:
a.在项目中添加包含目录:
$(SolutionDir)include
$(SolutionDir)include\opencv
$(SolutionDir)include\opencv2
b.在项目中添加库目录:
$(SolutionDir)lib
$(SolutionDir)lib\lib
7.项目属性中,链接器中添加 以下附加依赖项:
opencv_aruco330d.lib
opencv_bgsegm330d.lib
opencv_bioinspired330d.lib
opencv_calib3d330d.lib
opencv_ccalib330d.lib
opencv_core330d.lib
opencv_datasets330d.lib
opencv_dpm330d.lib
opencv_face330d.lib
opencv_features2d330d.lib
opencv_flann330d.lib
opencv_fuzzy330d.lib
opencv_highgui330d.lib
opencv_imgcodecs330d.lib
opencv_imgproc330d.lib
opencv_line_descriptor330d.lib
opencv_ml330d.lib
opencv_objdetect330d.lib
opencv_phase_unwrapping330d.lib
opencv_photo330d.lib
opencv_plot330d.lib
opencv_reg330d.lib
opencv_rgbd330d.lib
opencv_saliency330d.lib
opencv_shape330d.lib
opencv_stereo330d.lib
opencv_superres330d.lib
opencv_surface_matching330d.lib
opencv_text330d.lib
opencv_video330d.lib
opencv_videoio330d.lib
opencv_videostab330d.lib
opencv_xobjdetect330d.lib
opencv_xphoto330d.lib
8.项目属性中更改输出目录为宏OUTDIR
从之前编译的opencv_build目录的install目录下(build\install\x86\vc10\bin)寻找以下动态链接库:
opencv_core330d.dll
opencv_highgui330d.dll
opencv_imgcodecs330d.dll
opencv_imgproc330d.dll
opencv_ml330d.dll
opencv_videoio330d.dll
用到新的库再继续添加库,不仅仅限于这几个。
并复制到程序运行的debug目录下。
9.重新生成并运行。