这篇博客主要总结下在Ubuntu下安装opencv以及扩展库所遇到的问题,以及解决的方案。
Opencv版本:3.4.7+CUDA9.0+1060
一、下载Opencv+contrib
- 在Opencv官网中下载opencv+opencv_contrib源码,网站:https://github.com/opencv
- 选择releases
- 下载相应的版本的source code(zip)
- 同样的方式下载opencv_contrib
- 下载后的两个压缩包
二、安装依赖
sudo apt-get install build-essential
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 libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install ffmpeg
三、cmake
- cmake的安装
注意:我在安装opencv3.4.7时,遇到cmake以及cmake-gui版本过低问题,造成无法兼容c++11标准,cmake以及gui的安装、解决办法详见问题4
- 启动cmake-gui,终端输入如下命令:
cmake-gui
- 将opencv-contrib文件夹复制到openc文件夹中,命名为opencv_contrib,再新建一个build文件夹
- 在cmake-gui中选择source code、build路径
- source code:/home/xxx/ThreePartyLib/opencv-3.4.7
- build:/home/xxx/ThreePartyLib/opencv-3.4.7/build
- 点击Configure选择Unix Makefiles,其余默认,点击finish
注意:这里容易因为网络的原因无法下载IPPICV 包、face_landmark_model.dat,所以建议提前手动下载下来,手动下载方法参考问题2,3
- Configure完成
- 需要修改的地方
(1)、在CMAKE_BUILD_TYPE 值处输入RELEASE,其他保持不变(如果已经存在就不必修改)。
(2)、在OPENCV_EXTRA_MODULES_PATH处,选择输入目录(单击这一行后方空白处即可选中),接着选择opencv_contrib文件夹中的modules文件夹。
(3)、在ENABLE_CXX11后面打√。(Opencv3.4.7版本里包含了很多C++11标准,如果没选上会在make阶段报错,参考问题8)
(4)、如果需要cuda,在WITH_CUDA打√
(5)、在BUILD_opencv_world后面打√。
(这个√可以打上,也可以不用,如果选中表示可以只生成一个库。我在编译的后面去掉了这个,因为它造成和已有的一些包的冲突)
- sudo make
注意:建议sudo make,当然make也可以,这里可以因为权限问题造成终止。
- sudo make install
- 查询opencv版本
pkg-config --modversion opencv
四、环境配置
- 打开文件
sudo gedit /etc/ld.so.conf.d/opencv.conf
- 添加内容
/usr/local/lib
- 终端运行
sudo ldconfig
- 添加环境变量(这里有些博客添加在/etc/profile、/etc/bash.bahsrc、~/.profile,具体区别见注)
sudo gedit ~/.bashrc
- 添加
#opencv
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
- 更新环境变量
source ~/.bashrc
注:
/etc/ld.so.conf 此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。
- 默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,而通常通过源码包进行安装时,如果不指定--prefix会将库安装在/usr/local目录下,而又没有在文件/etc/ld.so.conf中添加/usr/local/lib这个目录。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。
- 对于此种情况有2种解决办法:
- 在用源码安装时,用--prefix指定安装路径为/usr/lib。这样的话也就不用配置PKG_CONFIG_PATH
- 直接将路径/usr/local/lib路径加入到文件/etc/ld.so.conf文件的中。在文件/etc/ld.so.conf中末尾直接添加:/usr/local/lib(这个方法给力!)
参考:https://www.cnblogs.com/chris-cp/p/3591306.html
ldconfig
- ldconfig这个程序,位于/sbin下,它的作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用,因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新的搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。
- PKG_CONFIG_PATH:环境变量,它是在安装了pkg-config后出现的其实pkg-config就是向configure程序提供系统信息的程序,比如软件的版本啦,库的版本啦,库的路径啦,等等。这些信息只是在编译其间使用。
/etc/profile、/etc/bash.bahsrc、~/.profile、~/.bashrc
- 这些文件都有环境变量的设定的作用
打开一个新的shell(包括打开一个新终端和在终端上输入bash),都会重新读取/etc/bash.bashrc 和 ~/.bashrc文件里面的内容。
Linux启动登录时会读取/etc/profile和~/.profile文件的内容。所以,重启登录时会读取/etc/profile和~/.profile文件的内容(此时并不读取/etc/bash.bashrc和~/.bashrc文件)。然后再打开终端时,会去读取/etc/bash.bashrc和 ~/.bashrc文件。这就出现了那种结果。
参考:https://blog.csdn.net/jirryzhang/article/details/70833544
问题:
1.No package 'libavresample' found
解决办法:
sudo apt-get install libavresample-dev
2.opencv IPPICV 下载不下来的问题解决
解决办法:
- 首先确定IPPICV版本,可以查看自己编译时的cmake信息,或者查看报错后的cmakedownloadlog.txt,找到下载地址。
- 到github中opencv厂库找到对应的版本下载下来。
https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20180723/ippicv
- 在
/opencv-[版本号]/3rdparty/ippicvippicv.cmake
中找到,如图所示set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv")
- 将这一行以后的命令(上图有颜色的部分),替换为:
set(OPENCV_ICV_UNPACK_PATH "${CMAKE_CURRENT_LIST_DIR}/unpack") set(OPENCV_ICV_PATH "${OPENCV_ICV_UNPACK_PATH}${OPENCV_ICV_PACKAGE_SUBDIR}") message(STATUS "ICV: Package successfully downloaded") set(OPENCV_ICV_PATH "${OPENCV_ICV_PATH}" PARENT_SCOPE) endfunction()
- 替换后为:
- 在同一级目录中(也就是
/opencv-[版本号]/3rdparty/ippicv/
)建立unpack
文件夹,把下载下来的ippicv包解压出的内容
放进unpack文件夹即可;
- 重新编译
3.face_landmark_model.dat下载不下来的问题解决
和上面一样,去cmakedownloadlog.txt,找到文件的地址然后进行下载,我的地址为:https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat
下载好后,修改配置文件
$ gedit /home/usrname/tool/opencv-3.4.0/opencv_contrib-3.4.0/modules/face/CMakeLists.txt #usrname 换成自己的用户名, <tool/opencv-3.4.0>换成自己opencv源码对应的文件夹
将CMakeLists.txt文件的第19行修改为本地路径,即将原来的网址修改为下载的文件保存的路径
"file:///home/usrname/install/" #"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${__commit_hash}/" # usrname记得替换为自己的用户名,路径记得替换为自己文件对应的路径
/home/usrname/install/这个文件地址根据你文件放的地址设置。
4.target_compile_features specified unknown feature cxx_std_11 for target...
- 原因:cmake版本太低的原因,故需重编cmake.
- 网址:https://cmake.org/download/
- 解决办法:
tar xvf cmake-3.15.0.tar.gz ./configure make && make install
- 升级cmake-gui将上诉命令改为
./configure --qt-gui
- 检查版本
cmake --version cmake-gui --version
5.对‘ZSTD_createDStream’未定义的引用
- 问题:和anaconda发生冲突
- 解决办法:把anaconda的环境变量去掉就可以了,然后删除build中的文件以及/usr/local/lib下面的libopencvxxx文件,重新cmake、make
6.fatal error: Eigen/Core: No such file or directory
- 解决办法:
sudo ln -sf eigen3/Eigen Eigen sudo ln -sf eigen3/unsupported unsupported
7./usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o):relocation R_X86_64_32S against
- 解决办法:(gflags是使用源码安装)
进入gflags/build中,找到CMakeCache.txt,改为CMAKE_CXX_FLAGS:STRING=-fPIC
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 make && make install
8.error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options
- 解决办法:勾选上c++11,重新make.
参考链接:
https://blog.csdn.net/echoamor/article/details/83022352
https://blog.csdn.net/skyloveyue/article/details/81703173
https://blog.csdn.net/CSDN330/article/details/86747867
https://blog.csdn.net/weixin_44003563/article/details/103612472