序言
经典图像处理库:OpenCV。在 Windows 上使用部署比较简单,可以分为使用源代码、使用动态库(.dll)、使用静态库(.lib)的方式,可是这些都是官方编译好的。而在 Linux 系统上使用,由于 Linux 有各种各样的发行版本,导致不能直接使用官方编译好的版本(常用版本),这个时候,就需要自己通过编译 OpenCV 源码的方式安装 OpenCV 了。
源码安装的方式会根据当前系统中安装的组件来编译,所以这编译出来的 OpenCV 库是对应这个系统独一无二的,因此将这个在这台机器上编译出来的 “独一无二” 的 OpenCV 移到别的系统上使用就不一定可行了。
接下来就说明如何源码安装 OpenCV。(这里用 Ubuntu 系统作为实例)
1 2 |
# 可以用下面的代码查看当前系统默认的 OpenCV 版本 pkg-config --modversion opencv |
安装
1、一般来说,应该先更新apt(可跳过)
1 2 |
sudo apt-get update sudo apt-get upgrade |
2、安装依赖库
如果不用其他第三方的依赖库,也可以正常编译出 OpenCV 库,但会因为缺少一些依赖,导致使用的时候出现一些找不到该函数之类的错误。因此酌情挑选安装依赖库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# 移除系统已经存在的依赖(看情况可以跳过) # 移除的目的是为了后面重安装 可以支持重装之前新安装的依赖 sudo apt-get remove x264 libx264-dev # 安装需要的依赖 sudo apt-get install build-essential checkinstall cmake pkg-config yasm sudo apt-get install git gfortran # 可以不装 装的目的是为了后面使用git下载OpenCV而已 sudo apt-get install libjpeg8-dev libjasper-dev libpng12-dev # 根据系统版本选择安装 # Ubuntu 14.04 sudo apt-get install libtiff4-dev # Ubuntu 16.04 以上 sudo apt-get install libtiff5-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev sudo apt-get install libxine2-dev libv4l-dev sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev sudo apt-get install qt5-default libgtk2.0-dev libtbb-dev sudo apt-get install libatlas-base-dev sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev sudo apt-get install libvorbis-dev libxvidcore-dev sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev sudo apt-get install x264 v4l-utils # 不重要依赖 可选择安装 sudo apt-get install libprotobuf-dev protobuf-compiler sudo apt-get install libgoogle-glog-dev libgflags-dev sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen |
这时候要确认好以上依赖都要安装好,不然如果某些依赖没有安装正确,编译得到的 OpenCV 会缺失一部分基本功能(在编译过程中会有提示但是不会因此停止编译,所以很难察觉!)。例如,利用 cv2.imread() 读图片的时候会读到 None。
3、python依赖(可选择)
一般现在的 Linux 系统都会或多或少的自带支持 python,因此都会有已装一些关于 python 的依赖,如:python-dev、python3-dev 等。
安装完上面的依赖后,开始部署 python 依赖,python 和 python3 两个版本都要安装,OpenCV 会据此自动生成两个版本的 python 依赖。(如果只想用 C/C++ 版不想用 python 版可以不安装,OpenCV 安装的时候回自动忽略。但强烈推荐安装!)
1 2 3 4 |
sudo apt-get install python-dev python-pip python3-dev python3-pip sudo -H pip2 install -U pip numpy sudo -H pip3 install -U pip numpy |
一般如果个人安装的话,会结合虚拟环境(如Anaconda)来安装 python 库,这样比较容易区分个人工程环境&系统全局环境。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Install virtual environment sudo pip2 install virtualenv virtualenvwrapper sudo pip3 install virtualenv virtualenvwrapper echo "# Virtual Environment Wrapper" >> ~/.bashrc echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.b source ~/.bashrc ############## For Python 2 ############## # create virtual environment mkvirtualenv facecourse-py2 -p python2 workon facecourse-py2 # now install python libraries within this virtual enviro pip install numpy scipy matplotlib scikit-image scikit-learn ipython # quit virtual environment deactivate ########################################## ############## For Python 3 ############## # create virtual environment mkvirtualenv facecourse-py3 -p python3 workon facecourse-py3 # now install python libraries within this virtual environment pip install numpy scipy matplotlib scikit-image scikit-learn ipython # quit virtual environment deactivate ########################################## |
4、下载 OpenCV 和 OpenCV_contrib
如果在上面安装依赖的步骤中,安装了 Git 依赖,而且网速不错,可以直接从 GitHub 上将 OpenCV 拉下来。
1 2 3 4 5 6 7 8 9 |
git clone https://github.com/opencv/opencv.git cd opencv git checkout 3.4.2 cd .. git clone https://github.com/opencv/opencv_contrib.git cd opencv_contrib git checkout 3.4.2 # 要和上面版本一致 cd .. |
5、编译安装 OpenCV
安装过程要了解各个重点。进入 OpenCV 目录,这里就是上面的 opencv 目录中,创建一个 build 文件夹目录。
1 2 3 |
cd opencv mkdir build cd build |
然后,利用 cmake 生成 makefile,并且设置选择项(安装的路径),具体请参考 cmakelist 中的参数帮助信息描述,这里只列出重要的几项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 很容易出现格式问题 最好自己照着敲 # \ 可以回车 然后会换行接着敲 # -D WITH_OPENGL=ON \ # 这个选项最好不要敲 # -D OPENCV_GENERATE_PKGCONFIG=ON \ # 很重要 生成pkg-config可读的库文件 # .. # 最后的两个点点别忘了 cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D WITH_TBB=ON \ -D WITH_V4L=ON \ -D WITH_QT=ON \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D BUILD_EXAMPLES=ON .. # 这里的目录结构如下 wordspace |-opencv_contrib |-opencv |-build(当前) |-... |
如果没有对 CMakeLists 进行修改,那么 OpenCV 会默认的安装到如下地址:
1 2 3 4 |
/usr/local/include/opencv2/ # 新版 OpenCV 核心头文件 /usr/local/include/opencv/ # 旧版 OpenCV 核心头文件 /usr/local/share/OpenCV/ # 一些 OpenCV 的其他安装信息 /usr/local/lib/ # OpenCV 中的动态链接库存放位置 |
有时候安装高版本的 OpenCV 却想保留系统原有的旧版本 OpenCV,就需要修改这里的安装路径,保留原有旧版本的 OpenCV。
cmake 设置完毕后,就可以进行 make 操作,这里可以直接用 nproc 查到 CPU 核心可以支持的最大线程数,然后酌情调用一半的资源对 OpenCV 进行 make 操作,提高编译速度。
1 2 3 4 5 6 7 8 |
# 利用下面的命令查看支持的最大线程数 nproc # 用-jn来调用n个线程 make -j24 sudo make install sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf' # 将 OpenCV 的动态链接库写入系统变量中 /usr/local/lib 这个地址根据自己的情况作修改 sudo ldconfig |
6、创建 python 接口 link
如果要使 python 接口对上 OpenCV,需要先查看到编译好的 OpenCV 生成的 .so 文件在哪里:
1 |
find /usr/local/lib/ -type f -name "cv*.so" # 这是对应的是在找默认安装路径的OpenCV |
找到的位置因为自己的 python 安装地址的不同,生成的地址会有所不同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
############ For Python 2 ############ ## binary installed in dist-packages path/to/python2.6/site-packages/cv2.so path/to/python2.7/site-packages/cv2.so ## binary installed in site-packages path/to/python2.6/site-packages/cv2.so path/to/python2.7/site-packages/cv2.so ############ For Python 3 ############ ## binary installed in dist-packages path/to/python3.5/site-packages/cv2.cpython-35m-x86_64-linux-gnu.so path/to/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so ## binary installed in site-packages path/to/python3.5/site-packages/cv2.cpython-35m-x86_64-linux-gnu.so path/to/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so -- CHANGE LINK -- ############ For Python 2 ############ cd path/to/python2.7/site-packages sudo ln -s path/to/python2.7/site-packages/cv2.so cv2.so ############ For Python 3 ############ cd path/to/python3.6/site-packages sudo ln -s path/to/python3.6/site-packages/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so |
如果是个人的虚拟环境,则:
1 2 3 4 5 6 7 |
############## For Python 2 ############## cd ~/.virtualenvs/facecourse-py2/lib/python2.7/site-packages ln -s /usr/local/lib/python2.7/dist-packages/cv2.so cv2.so ############## For Python 3 ############## cd ~/.virtualenvs/facecourse-py3/lib/python3.6/site-packages ln -s /usr/local/lib/python3.6/dist-packages/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so |
7、开发环境配置
如果要利用 OpenCV 开发库时,其他使用这个库的程序编译时所需的库信息,在 Linux 上是通过 pkg-config 获取的(如version、include、lib等),如下:
1 2 |
CFLAGS+= `pkg-config --cflags $(PKGS)` LIBS+= `pkg-config --libs $(PKGS)` |
这是因为关于库的信息是由 pkg-config 管理,方便获取,一般其管理的文件目录在 /usr/lib/pkgconfig 或者 /usr/local/lib/pkgconfig。系统默认是用的 /usr/lib/pkgconfig 上,但用户自己编译安装的库基本都安装在 /usr/local/ 目录下,所以才会有 “我安装了这个库,怎么 pkg-config 没有信息!” 这种错误。
当 pkg-config 没有检测到 xxx 库的信息时候,可以考虑的原因有以下几种:
- 因为 /usr/lib/pkgconfig 和 /usr/local/lib/pkgconfig 的缘故,pkg-config 检测的是默认的 /usr/lib/pkgconfig,其中并没有 xxx 库的信息文档
解决办法:将 /usr/lib/pkgconfig 加入到环境里,修改参数 PKG_CONFIG_PATH ,具体操作如下:
1 2 3 4 5 |
vim ~/.bashrc export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH} source ~/.bashrc |
- 因为 xxx 库安装不完全,在 pkgconfig 目录内没有生成该库对应的信息文档 xxx.pc 文件
解决办法:以 CMake 为例,在上面编译中设置参数 OPENCV_GENERATE_PKGCONFIG=ON。然后在生成的目录下 /lib/ 中会生成一个 pkgconfig 目录里头有记录该库信息的 xxx.pc 文件。
- 因为指定了 xxx 库的安装位置,里头有 xxx.pc 文件了,但并没有将文件移到 pkgconfig 目录中,或者没有将该 xxx.pc 文件所在目录加入到 PKG_CONFIG_PATH 变量里
解决办法:将 xxx.pc 文件 copy 到 /usr/lib/pkgconfig 或者 /usr/local/lib/pkgconfig 中,又或者将该文件所在目录添加到 ~/.bashrc 文件的 PKG_CONFIG_PATH 变量里。
后续检测
—测试是否安装正确
下载RedEyeRemover.zip,解压后利用下面的命令编译一下看是否能运行:
1 2 3 4 5 |
unzip RedEyeRemover.zip && cd RedEyeRemover # 注意 pkg-config --libs --cflags opencv 这里括住的不是单引号(‘’)而是(`) g++ -std=c++11 removeRedEyes.cpp `pkg-config --libs --cflags opencv` -o removeRedEyes # 运行生成的可执行文件 ./removeRedEyes |
检测 python,在安装 OpenCV 的 python 环境下:
1 2 |
>>> import cv2 >>> print(cv2.__version__) |
—卸载源码安装的 OpenCV(重要)
如果要卸载源码安装的 OpenCV,需要在之前 build 文件夹中执行 sudo make uninstall
因为源码安装后的 OpenCV 相关文件信息都在 build 的 CMakeFile 中有记录,所以可以直接快速卸载。
要是没有卸载干净,可以手动人为的进行卸载,如(以默认安装路径为例):
1 2 |
sudo rm -rf /usr/local/include/opencv2 /usr/local/include/opencv /usr/local/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv* sudo rm -rf /usr/include/opencv /usr/include/opencv2 /usr/share/OpenCV |