学习高翔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!!!
 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐