在之前其实已经谈了很多关于如何搭建OpenCV环境的博客了,对于Python环境,如果安装普通版本,见这篇博客;如果需要安装Contrib版本,见这篇博客。 对于C++版本的OpenCV,参考这篇博客。 这篇博客主要介绍C++的Contrib版本的OpenCV安装。
1.下载源码
既然是Contrib版本,因此下载的源码包括两部分:OpenCV和OpenCV Contrib,分别点击去Github下载即可。 在各自的项目主页里点击”Releases”,如下。 选择需要的版本,下载Source Code即可。唯一需要注意的是OpenCV的代码要和Contrib的代码版本保持一致,否则会出错。
2.配置代码
下载好代码后,将两个压缩文件分别解压,并且将解压后的Contrib的文件整体放到OpenCV目录下,如下所示。
然后在OpenCV文件夹下建个build
的文件夹用于存放生成的一些文件。这样,相关文件配置就完成了。
3.配置CMake
这一步推荐用CMake的GUI做,这样更加直观一些,当然如果你是高手,直接在终端中输入参数也不是不可以。在终端中输入cmake-gui
即可打开CMake界面,如下。
在”Where is the source code”里选择OpenCV目录,在”Where to build the binaries”选择刚刚我们建立的build
目录。
因为这里需要编译的是Contrib,因此还需要修改一些变量,如果普通安装的话那么这里不需要修改任何参数,直接Configure然后Generate就可以了。
需要修改的参数主要有以下几个:
(1)OPENCV_EXTRA_MODULES_PATH
这个参数指定的是额外模块的路径,指定了之后CMake就会自动寻找是否有额外模块。需要注意的是路径是contrib目录下的modules
,例如/root/softwares/opencv-3.4.6/opencv_contrib-3.4.6/modules
,而不能只写到/root/softwares/opencv-3.4.6/opencv_contrib-3.4.6
,会提示找不到模块。
(2)OPENCV_ENABLE_NONFREE
这个参数的作用是启用OpenCV中的非免费模块,如果你想使用SIFT、SURF等算法,则必须要开启,否则等你调用它们的时候会提示它们是非免费模块,没有启用。
以上便是两个使用Contrib模块必须要修改的参数,其它没有特殊要求默认即可。配置好后,点击”Configure”按钮,CMake即开始配置,不出意外的话会会下载一些文件,这些文件都是外网的,还比较大,因此经常失败。
一般有两个文件比较难下,一个是face_landmark_model.dat
。
所以建议提前下好,然后放到指定目录下。首先这个文件下载地址在这里,手动下载好之后,找到opencv-3.4.6/opencv_contrib-3.4.6/modules/face
下面的CMakeLists.txt
文件并打开。
找到其中以”https”开头的一串网址,如下。
将其替换成你下载好的文件路径,如下。
另一个比较难下的是以”IPP开头的一个文件”,同理,打开opencv/3rdparty/ippicv/ippicv.cmake
文件,找到其中如下内容。
将其替换成你下载好的文件路径即可,如下。
这样基本就不会再出问题了,如下显示”Configuring done”。
再点击”Generate”就可以完成CMake配置了。
4.编译代码
在新建的build
文件夹里打开终端,直接输入make
就可以,至于用几个线程看你的电脑配置,我在虚拟机上用两个线程make -j2
,之前在树莓派上编译的时候只能用一个线程。
然后就是漫长的等待了,如下图。
同时这一步也是最不确定的一步,一些莫名其妙的问题都是在这一步出现的,有时候确实很随缘。遇到问题多多百度,只能祝你好运了。在下面的参考资料中也说到了一些问题可以参考。
如果顺利到100%,恭喜,编译完成了。
[2020-02-20更新]
补充一下,在使用ROS调用OpenCV的时候有时候会报GTK2和3版本不兼容、不能同时使用的问题。这个问题其实也非常好解决,在CMake的时候,找到WITH_GTK_2_X
,打勾,再重新编译安装OpenCV即可。更多可以参考这个网页。
[更新结束]
5.安装代码
在完成make
之后,直接make install
即可将相关头文件拷贝到系统中去,之后就可以调用了。
make install
以后,源文件不建议删除,因为如果以后还需要卸载的话,直接在build
目录下打开终端输入make uninstall
即可,否则的话只能手动删除目录文件了。
6.参考资料
- [1]https://blog.csdn.net/u010739369/article/details/79966263
- [2]https://blog.csdn.net/CSDN330/article/details/86747867
- [3]https://www.cnblogs.com/needybeerlxy/p/8979238.html
- [4]https://blog.csdn.net/zxj_yantai/article/details/78779880
- [5]https://blog.csdn.net/u011361393/article/details/83210824
- [6]https://www.cnblogs.com/leoking01/p/8306935.html
本文作者原创,未经许可不得转载,谢谢配合