0 引言
通常在ubuntu下使用opencv而不使用contrib模块时,通过pip安装opencv,无需自己编译。但是,在使用contrib模块时,需要自己编译,这样也能很好的适应本地环境。编译opencv的过程不复杂,但是在CMake和make过程中会出现很多问题,这是比较烦人的。很久之前做的,现在终于有时间整理一下了。
1 安装流程
首先介绍一下安装的流程,非常简单,参考这篇博客
1.1 安装依赖项
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
可选的(这部分不用全部安装,在CMake时会提示缺少的依赖项,再对应安装即可)
sudo apt-get install checkinstall yasm libtiff5-dev libjpeg-dev libjasper-dev libdc1394-22-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils libeigen3-dev
1.2 下载opencv源码
这里有两种方法,一种时在终端clone;另一种是浏览器下载压缩包。我采用的是第二种方法。注意:在clone后要确认分支,可以参考这篇博客。
opencv下载地址:https://github.com/Itseez/opencv/archive/3.1.0.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip
注意:解压后,要将contrib库放到opencv库的文件夹下
1.3 CMake
创建编译目录:
1 cd opencv-3.1.0
2 mkdir release
3 cd release
执行cmake编译命令:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/opencv/opencv_contrib/modules/ ..
CMAKE_INSTALL_PREFIX为你的opencv安装路径,OPENCV_EXTRA_MODULES_PATH是你的opencv_contrib/modules/的路径。 在执行cmake命令后,会报错导致编译失败,具体解决办法后面详细解释;成功则提示如下:
1.4 安装
make
sudo make install
make的过程可能会出现两个问题:1. python -fpIC编译 2. 动态链接库中断,添加symlink 后面会详细说明
make 成功后,install基本没啥问题
1.5 检查是否安装成功
$ pkg-config --modversion opencv
输出3.1.0,表示成功:
2.CMake 过程中问题解决
2.1 明确的问题
以下问题主要是参考这篇博客。(对于在参考博客中有详细说明的,我就不赘述了,我只详细说明博客中没有涉及到的或者我自己解决问题过程中的情况)
问题一:下载包ippicv_linux_20151201.tgz超时
这个问题我没有遇到,如果遇到可以参考博客,里面有详细解释。
问题二:缺失一堆依赖项(例如:
)-- No package 'gtk+-3.0' found,参考博客中有说明
问题三:
-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find Atlas (missing: Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY)
-- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)
$ sudo apt-get install libopenblas-dev
$ sudo apt-get install doxygen
问题四:
-- Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH)
这个问题在参考博客中有解决办法而且方法正确有效。需要说明的是,参考博客中的环境变量添加的第一句多了一个 > 符号,正确的如下:
特别注意的地方:当更改环境变量后,一定要继续在当前终端进行后续操作,因为更改后的环境变量仅仅在当前终端有效(涉及到环境变量的更改问题,可以参考 ubuntu 环境变量更改方式及特性 )
以上,就是参考博客中给出的问题及解决办法,可以说已经很完备了。但是,我还遇到了另外的一个问题:提示需要python版本3.5.2。在安装完python3.5.2后,cmake依然提示错误:
numpy 的问题是python环境变量的添加,见问题五;JNI Matlab VTK 这三个问题,在问题四正确设置环境变量后消失;需要特别说明的是最后一个问题:因为我的文件夹名中包含了空格,所以会出现错误;因此ubuntu 下 文件夹名字最好不要包含空格。
所以,问题五主要是python3.5.2的安装以及环境变量的更改。
问题五:安装python3.5.2后遇到的问题
安装的具体过程就不说了,详细过程参考 ubuntu16.04.lts安装python3.5.2 。下面说一些安装成功后,cmake时遇到的问题。
1)
参考博客:https://blog.csdn.net/qq_36362060/article/details/78516703
这个问题的原因就是环境变量中缺少了一个numpy的路径,因此在profile中添加如下:
这个路径是numpy所在的位置
当然啦,你要先验证是否安装了numpy
python #打开python终端
import numpy
如果报错,则先安装:
pip install numpy # pip3 是在安装python时默认安装的
2)ubuntu16.04 安装opencv Could NOT find PythonLibs (missing: PYTHON_LIBRARIES
出现过这个问题,但是忘记怎么处理的了,有可能是参考的该博客:https://blog.csdn.net/lei396601057/article/details/79850084
2.2 未知问题
有些问题忘记是在哪里出现的,但是确定是解决过,并且方法正确,现在总结在下面。
问题一:更换源时,sudo apt-get update 结果出现异常
参考 这里
问题解决后的正确结果:
问题二:
就是这个295的问题,我忘记是怎么解决的,只记得是某一步骤完成后,这个295顺带也就消失了,并不像以下两篇博客说的那样 博客1 博客2 ,况且也没有给出对应的解决办法。下面这个我试了多次都是无法定位到源(已经更新过源了,也换了很多个)
gstreamer-plugins-base-devel
3. make 过程中的问题解决
在make过程中主要是存在一个问题:
参考博客:https://taoo.iteye.com/blog/1826912 https://blog.csdn.net/quantum7/article/details/83475300
问题原因:下载的python包中已经有很多已经编译好的.o文件,我们需要将这些全部删除,并且再重新进行python的编译安装。注意:因为之前已经安装过一次了,所以要找到安装位置,进行删除。
只要按照参考博客中的方法进行,该问题确定可以解决。(PS:其实,在第一次安装python的时候就应该注意,就不会出现这个问题)
附加小问题:
大多数Linux环境下出现此类Bug时,一般大部分原因是因为make 编译的时候,动态链接库的链接性中断,因此解决方案为添加symlink.
我印象中是解决掉上面第一个问题,后面的问题就消失了。所以这里只说明对第一个问题的解法。参考 https://blog.csdn.net/wangchuansnnu/article/details/44199897
------------------------------------------------------------ 分界线 ------------------------------------------------------------------------
更新:
1. 在进行slam工程调试时,需要用到可视化模块viz,提示如下:
很明显,缺少viz模块;重新进行opencv编译,流程如下:
1. 1 下载依赖项
sudo apt-get isntall libvtk5-dev
1. 2 cmake 时加上 -DWITH_VTK=ON这个参数
具体参考 这里
1.3 需要注意的
如果之前已经编译过opencv,需要将原来的删除,再重新进行编译。删除方法:
1)、在安装目录下执行
make uninstall
(如安装目录为/opt/software/opencv3.1.0/release)
2)、删除系统相关文件
cd /usr
sudo find . -name "*opencv*" | xargs sudo rm -rf (为一句指令)
卸载完毕(可以用 sudo find . -name "*opencv*" | xargs 验证,查看是否卸载干净)
参考 这里
2 问题:slam工程调试时,cmake 没有问题,在make时 遇到如下问题:
解决方法:locate找到hdf5.h
在/usr/include/hdf5/serial/hdf5.h
在opencv_contrib-3.1.0/modules/hdf/include/opencv2/hdf/hdf5.hpp 文件中修改第40行
将#include <hdf5.h> 修改成#include "/usr/include/hdf5/serial/hdf5.h"
参考 这里
需要提醒的是,在进行locate之前,先进行更新:sudo updatedb 参考 这里
下面贴出我的更新前后对比:
3 工程调试的问题
在经过以上操作后,可以成功运行slam工程。但是,会出现如下提示:
read total 1 entries ;寻找源代码发现,是数据集处理存在问题,参考 TUM 数据集 小坑
以上, 大功告成!