[Ubuntu 18.04][Anaconda3]OpenCV-4.4.0安装

使用OpenCV源码进行编译和安装

参考:

Installation in Linux

Install OpenCV-Python in Ubuntu

依赖

安装以下依赖文件,其中使用Anaconda安装Python相关依赖:

# For C++
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
# For Python
pip install numpy
[required] sudo apt install cmake gcc g++ libavcodec-dev libavformat-dev libswscale-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgtk2.0-dev libgtk-3-dev
[optional] sudo apt-get install libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev

源码

同一路径下下载OpenCV以及OpenCV_Contrib源码

$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git

切换到4.4.0版本

$ cd opencv
$ git checkout -b 4.2.0 4.2.0
$ cd ../opencv_contrib
$ git checkout -b 4.2.0 4.2.0

编译

opencv/opencv_contrib同一路径下新建文件夹build/install,分别用于存放构建文件以及编译文件

$ mkdir build
$ mkdir install
$ ls
build  install  opencv  opencv_contrib

编写构建脚本build.sh

#!/bin/bash

set -eux

cd build
cmake \
    -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=../install \
    -D BUILD_DOCS=ON \
    -D BUILD_EXAMPLES=ON \
    -D BUILD_opencv_python3=ON \
    -D BUILD_opencv_python2=OFF \
    -D PYTHON3_EXECUTABLE=/home/zj/anaconda3/bin/python \
    -D PYTHON3_LIBRARY=/home/zj/anaconda3/lib/libpython3.7m.so \
    -D PYTHON3_INCLUDE_DIR=/home/zj/anaconda3/include/python3.7m \
    -D PYTHON3_NUMPY_INCLUDE_DIRS=/home/zj/anaconda3/lib/python3.7/site-packages/numpy/core/include \
    -D Pylint_DIR=/home/zj/anaconda3/bin/pylint \
    -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
    -D OPENCV_GENERATE_PKGCONFIG=ON \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D WITH_FREETYPE=ON \
    ../opencv

make -j8
make install

执行构建脚本,完成OpenCV C++以及Python库编译

python

编译完成后在install/lib文件夹内生成了python3.7,将其中的cv2文件夹软链接方式复制到Anaconda

$ cd ~/anaconda3/lib/python3.7/site-packages
$ ln -s ~/opencv/opencv-4.4.0/install/lib/python3.7/site-packages/cv2 cv2

测试cv2是否载入

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/zj/anaconda3/lib/python3.7/site-packages/cv2/__init__.py", line 96, in <module>
    bootstrap()
  File "/home/zj/anaconda3/lib/python3.7/site-packages/cv2/__init__.py", line 86, in bootstrap
    import cv2
ImportError: /home/zj/anaconda3/bin/../lib/libfontconfig.so.1: undefined symbol: FT_Done_MM_Var

参考:ubuntu18.04 with anaconda3 编译 opencv3.4.7

是因为Anaconda自带的libfontconfig.so.1.12.0版本过高所致

$ ls libfontconfig.
libfontconfig.a          libfontconfig.so         libfontconfig.so.1       libfontconfig.so.1.12.0  

/usr/lib/x86_64-linux-gnu/libfontconfig.so.1.10.1复制到Anaconda中,替换当前链接

$ cd 
$ cp /usr/lib/x86_64-linux-gnu/libfontconfig.so.1.10.1 .
$ file libfontconfig.
libfontconfig.a          libfontconfig.so.1       libfontconfig.so.1.12.0
libfontconfig.so         libfontconfig.so.1.10.1  


$ file libfontconfig.so.1
libfontconfig.so.1: symbolic link to libfontconfig.so.1.12.0
$ ln -s libfontconfig.so.1.10.1 libfontconfig.so.1
ln: 无法创建符号链接'libfontconfig.so.1': 文件已存在
$ rm libfontconfig.so.1
$ ln -s libfontconfig.so.1.10.1 libfontconfig.so.1
$ file libfontconfig.so.1
libfontconfig.so.1: symbolic link to libfontconfig.so.1.10.1

遇到类似的问题使用相同的操作即可,或者参考在装有python3.6的Anaconda3虚拟环境中安装opencv3.4.4,将lib下的链接文件删除也行(这样就会寻找/usr/lib下的库文件了)

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/zj/anaconda3/lib/python3.7/site-packages/cv2/__init__.py", line 96, in <module>
    bootstrap()
  File "/home/zj/anaconda3/lib/python3.7/site-packages/cv2/__init__.py", line 86, in bootstrap
    import cv2
ImportError: /home/zj/anaconda3/bin/../lib/libpangoft2-1.0.so.0: undefined symbol: FcWeightFromOpenTypeDouble
# 解决
~/anaconda3/lib$ mv libpangoft2-1.0.so.0 libpangoft2-1.0.so.0_bak

自编译的cv2无法查看函数定义,在PyCharm中会出现

Cannot find reference 'imwrite' in '__init__.py' 

所以在实际开发过程中,可以使用opencv-python;在生产环境再使用自编译库