学习高翔slam14讲的过程当中安装opencv发现又是各种报错,现记录如下,以供后人参考。
1、首先下载opencv和opencv_contrib的库
contrib库:https://github.com/opencv/opencv_contrib/releases
opencv版本:https://opencv.org/releases.html
我下载的是3.4.1
2、把这两个包解压并且把opencv_contrib-3.4.1这整个文件夹拷贝到opencv-3.4.1文件夹里面去
unzip opencv-3.4.1.zip
unzip opencv_contrib-3.4.1.zip
cp -r opencv_contrib-3.3.1 opencv-3.3.1 #复制opencv_contrib到opencv目录下
3、安装opencv所需要的依赖项
sudo apt-get install build-essential libvtk5-dev
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install build-essential qt5-default ccache libv4l-dev libavresample-dev libgphoto2-dev libopenblas-base libopenblas-dev doxygen openjdk-8-jdk pylint libvtk6-dev
sudo apt-get install pkg-config
上面的这些依赖项你系统里面可能已经安装过了,所以只要没有报错就行了,它会提示你系统内已经安装过的。
slam14讲里面的依赖项还有一个libvtk5-dev,这个依赖项把我给弄惨了,一直报错:
the following packages have unmet dependencies:
libvtk5-dev: Depends: libnetcdf-dev but it is not going to be installed
Depends: libnetcdf-cxx-legacy-dev but it is not going to be installed
Depends: libvtk5.10( = 5.10.1+dfsg-2.1build1) but it is not going to be installed
然后后来我就放弃挣扎打算先安装ros,安装过程当中发现更改成中科大镜像源之后,libvtk5-dev这个依赖项就可以安装了!!!
更改镜像源这个有很多博客都介绍了,我简单复制过来了
sudo gedit /etc/apt/sources.list
会弹出一个gedit 的文档,把里面的内容替换成下面的内容。如果你不愿意删除原来的那些内容,怕以后有什么问题,可以用“#”把它们先注释掉,然后加上下面的这些内容也可以。
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
然后执行:
sudo apt-get update
再安装libvtk5-dev就可以安装上了
sudo apt-get install libvtk5-dev
好的,到这里依赖项总算是完成了。下面我们开始编译opencv源码
3、编译
这里我先放出错误,以作警示。
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFReadDirectory@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFGetFieldDefaulted@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFNumberOfDirectories@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFIsTiled@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFOpen@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFDefaultStripSize@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFReadRGBAImage@LIBTIFF_4.0'
//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: undefined reference to `TIFFReadTile@LIBTIFF_4.0'
这里可把我给害惨了!!!痛苦。。。上面我有提到我因为安装不了libvtk5-dev这个依赖项先去安装了ros,这个时候我的ros已经安装好了,可以运行了,也发现libvtk5-dev这个依赖项可以安装了,然后开始开开心心的编译安装opencv,但又发现了这个错误。我在网上查了一下解决办法,有人说执行下面两条指令就有用。具体有没有用我不清楚,但是可把我害惨了!!!autoremove 直接把我刚刚安装好的ros的各种依赖给remove了!!!我刚安装好的ros就这样没了,心中一万个草泥马飞过。
sudo apt-get autoremove libtiff5-dev
sudo apt-get install libtiff5-dev
好的,淡定,这是自己踩的坑,微笑走下去,我又开始在网上找解决办法,果然还是stackoverflow大法好,终于找到了解决办法,cmake的时候加上“ -D BUILD_TIFF=ON ”。
为了照顾一些还不了解如何操作cmake指令的童鞋,所以还是写详细一些:
首先进入opencv-3.4.1这个文件夹里面,然后打开终端:
mkdir build
cd build
这里是为了让cmake产生的文件都放到build里面去,不会显得那么乱,好的下面是最重要的cmake指令了,大家要看仔细了:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/npkhgl/software/opencv-3.4.1/opencv_contrib-3.4.1/modules/ -D BUILD_TIFF=ON ..
因为我们还安装了opencv-contrib,所以还有一个OPENCV_EXTRA_MODULES_PATH 这个变量名,后面要跟上你自己的路径名,记得修改一下。
后面就是简单的
sudo make
sudo make install
你也可以使用多线程编译,-j8表示使用8线程编译,速度快很多。
sudo make-j8
sudo make install
4、链接库共享
编译安装完毕之后,为了让你的链接库被系统共享,让编译器发现,需要执行管理命令ldconfig:
sudo ldconfig -v
5、接下来可以配置一些OpenCV的编译环境首先将OpenCV的库添加到路径,从而可以让系统找到,接下来的步骤参照了
https://blog.csdn.net/cocoaqin/article/details/78163171,这篇博客
sudo gedit /etc/ld.so.conf.d/opencv.conf
执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加
/usr/local/lib
6、执行如下命令使得刚才的配置路径生效
sudo ldconfig
这个时候可能会提示错误如下图所示(上部分)
sbin/ldconfig.real: /usr/lib/nvidia-375/libEGL.so.1 不是符号连接
/sbin/ldconfig.real: /usr/lib32/nvidia-375/libEGL.so.1 不是符号连接
出现这个错误可能是由于系统BUG所致
只需要分别执行下部分的四行命令就可解决
sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org
sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org
sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.39 /usr/lib/nvidia-375/libEGL.so.1
sudo ln -s /usr/lib32/nvidia-375/libEGL.so.375.39 /usr/lib32/nvidia-375/libEGL.so.1
7、配置bash
sudo gedit /etc/bash.bashrc
在最末尾添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存,执行如下命令使得配置生效
source /etc/bash.bashrc
更新
sudo updatedb
8、至此所有的配置都已经完成
下面用一个小程序测试一下
找到
cd到opencv-3.4.1/samples/cpp/example_cmake目录下
我们可以看到这个目录里官方已经给出了一个cmake的example我们可以拿来测试下
按顺序执行
cmake .
make
./opencv_example
即可看到打开了摄像头,在左上角有一个hello opencv
即表示配置成功
至此,总结一下:
一定不要轻易autoremove!!!很容易把其他软件依赖的库给删掉,从而导致其他软件无法正常使用。安装其他东西的时候也一定要注意不要同意系统提示的remove!!!