Ubuntu18.04编译安装OpenCV3.4

Ubuntu18.04编译安装OpenCV3.4

基本准备

工具软件: cmake, git

sudo apt install cmake git

系统支持:

gcc 和 essential 开发包、libtbb(Intel 线程构建块)、GTK+ 2.x 或更高(包含header)、pkg-config

IO:zlib、libpng、libjpeg、libtiff、libjasper,并包含开发文件(xxx-dev)

Python支持:Python2.6或更高(包含开发包),Numpy

视频优化:来自ffmpeg的 libavcodec、libav*,安装 libav/ffmpeg 包。gstreamer 、 libdc1394 和 libv4l。

# Ubuntu 18.04默认安装了 gcc7.3.0 和 build-essential
sudo apt install gcc build-essential
sudo apt install libtbb-dev libtbb2
# 安装时,gtk3已经有,libgtk-3*
sudo apt install libgtk2.0-dev pkg-config

sudo apt install zlib1g-dev libpng-dev libjpeg-dev libtiff-dev
# 无法找到libjasper包,所以添加以下源
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt-get update
sudo apt install libjasper-dev

# 由于使用python3多一些,所以安装 python3 的相关包
sudo apt install python3-dev python3-numpy

sudo apt install libavcodec-dev libavformat-dev libavresample-dev libswscale-dev
# 以下4个视频读取库,只要安装 ffmpeg 就可安装
sudo apt install ffmpeg libdc1394-22-dev libv4l-dev liblapacke-dev

由于之前安装其他软件,以上的大多数库和包都已经安装,但是为了后续的安装顺利,还是都试着安装了一遍。

下载源码

下载github上下载OpenCV源码,下载链接:

git clone --branch 3.4.5 https://github.com/opencv/opencv.git
git clone --branch 3.4.5 https://github.com/opencv/opencv_contrib.git

编译安装

进入opencv的下载目录,创建 build 目录,并在该目录中进行编译。

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
	-D CMAKE_INSTALL_PREFIX=/usr/local \
	-D OPENCV_EXTRA_MODULES_PATH=/home/xiaotao/Packages/opencv_contrib/modules \
	..

添加对pkg-config的支持:

 -D OPENCV_GENERATE_PKGCONFIG=ON

如果想生成Python 支持,则需要添加额外配置

	-D PYTHON3_EXCUTABLE=/home/sn/anaconda3/bin/python3 \
	-D PYTHON_INCLUDE_DIR=/home/sn/anaconda3/include/python3.7m \
	-D PYTHON_LIBRARY=/home/sn/anaconda3/lib/libpython3.7m.so.1.0 \
	-D PYTHON3_NUMPY_INCLUDE_DIRS=/home/sn/anaconda3/lib/python3.7/site-packages/numpy/core/include/ \
	
	# 官网的说明如下
	PYTHON2(3)_EXECUTABLE = <path to python>
    PYTHON_INCLUDE_DIR = /usr/include/python<version>
    PYTHON_INCLUDE_DIR2 = /usr/include/x86_64-linux-gnu/python<version>
    PYTHON_LIBRARY = /usr/lib/x86_64-linux-gnu/libpython<version>.so
    PYTHON2(3)_NUMPY_INCLUDE_DIRS = /usr/lib/python<version>/dist-packages/numpy/core/include/

在 Anaconda 中, 默认Python环境(base)保存在 Anaconda 目录下,对于其他自己创建的环境,保存在 anaconda/envs/env_name 中。

在 cmake的过程中,任何配置的出错,都需要删除重新开始。

Python 支持

 --Installing: /usr/local/lib/python3.6/site-packages/cv2/__init__.py
-- Installing: /usr/local/lib/python3.6/site-packages/cv2/load_config_py2.py
-- Installing: /usr/local/lib/python3.6/site-packages/cv2/load_config_py3.py
-- Installing: /usr/local/lib/python3.6/site-packages/cv2/config.py
-- Installing: /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so
-- Set runtime path of "/usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so" to "/usr/local/lib"
-- Installing: /usr/local/lib/python3.6/site-packages/cv2/config-3.6.py

可以看到,生成的Python包被安装到了 /usr/local/lib/python3.6/site-packages/cv2 目录下,要为Anaconda中的python使用,需要复制到 Anaconda环境的相关目录。

复制到以上目录后,在 Anaconda 中导入 cv2,出现一下错误。

ImportError: /home/ss/anaconda3/bin/../lib/libfontconfig.so.1: undefined symbol: FT_Done_MM_Var

尝试各种办法无果,最终放弃。


2019-07-02
还好没放弃,因为需要 opencv_contrib 包,不得不再次尝试。
undefined symbol: FT_Done_MM_Var 错误的原因,libfontconfig.so.1 造成。其根本原因是,Anaconda的 lib 中,把 Python需要的各种 lib 单独列了出来,造成和系统中的库版本不一致。
系统库所在位置: /usr/lib/x86_64-linux-gnu/ ,opencv 的 Python版本是按照系统库编译的,而在调用时,使用了 anaconda/lib 中的库。

解决办法

  1. libfontconfig.so.1 建立新的连接,指向系统库目录下的 libfontconfig.so.10.1
  2. 直接复制系统库目录下的 libfontconfig.so.10.1 文件,替换 Anaconda目录下的 libfontconfig.so.11.1

经过以上的处理,可能会造成新的 undefined symbol 错误。毕竟依赖的库那么多,会有未知的坑等着。但解决方法类似。庆幸自己只改了两个就正常运行了。

起初使用 Anaconda 是为了方便不同的Python版本和环境的管理,最后发现,在需要编译安装某些库的时候, Anaconda带来了更多的麻烦。谨慎使用。


python中直接安装 opencv

sudo apt-get install python-opencv  
pip install python3-opencv

编译和安装

make
sudo make install

卸载

进入到 opencv/build 目录,执行以下命令:

sudo make uninstall

测试是否安装

pkg-config --cflags --libs opencv

能显示OpenCV库的相关位置信息,则安装成功。

部分博客中提到,要在 /usr/local/lib/pkgconfig/opencv.pc 文件进行如下更改:

# 添加
includedir_old2=${prefix}/include/opencv2

#最后一行修改为
Cflags: -I${includedir_old} -I${includedir_old2} -I${includedir_new}

但是在测试中,发现自己的系统加不加都一样。

参考资料

OpenCV官网 https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html

你可能感兴趣的:(OpenCV)