在linux-mint20.03上编译opencv-3.4.11
参考链接:https://www.yuque.com/docs/share/0fefb9de-9f4b-45e5-93c4-2af8f6289b6b#
Step I:下载源码
从Github主页即可下载对应版本:https://github.com/opencv/opencv
源码下载完成并且解压后,比如解压文件夹名称为opencv-3.4.11-sourcecode
,要在这个文件夹下新建一个文件夹,比如build
,CMAKE需要在../opencv-3.4.11-sourcecode/build
目录下。
Step II: 下载依赖项
从官方文档https://docs.opencv.org/3.4.11/d2/de6/tutorial_py_setup_in_ubuntu.html查看需要提前安装的依赖项。
一定要先安装依赖项,不然后面如果缺少依赖而导致报错,就要推倒重来。
对于opencv-3.4.11,必须要有的依赖项:
sudo apt-get install cmake
sudo apt-get install gcc g++
# for python 2
sudo apt-get install python-dev python-numpy
# for python 3
sudo apt install python3-dev python3-numpy
这里有关python2和python3,linux-mint20.03上python2.7和3.8都有,分别使用使用python2
和python3
命令调用。在opencv的编译过程中,如果你只需要python3,那么可以忽略python2,那么最后只会有一个python3
的文件夹,也只能在python3中使用;如果两个都配齐了,那会生成python2 python3
两个文件夹,2和3都能使用。
# GTK support
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
# support GTK 2
sudo apt install libgtk2.0-dev
# support GTK 3
sudo apt install libgtk-3-dev
可选依赖,主要是一些图片格式
sudo apt-get install libpng-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libopenexr-dev
sudo apt-get install libtiff-dev
sudo apt-get install libwebp-dev
Step III: CMAKE
如果选择默认位置安装的话,参照上面的链接即可。如果不是有特殊需求,直接使用默认位置是最推荐的。下面的配置除了添加/lib库之外,都不需要操作
自己选择了位于Anaconda下的虚拟环境cv
,python=3.8下构建,也需要提前在这个环境安装python-dev, numpy
两个包;并且自己指定安装位置。
在../opencv-3.4.11-sourcecode/build
目录下进行CMAKE,注意,由于我们是虚拟环境,所以我们需要手动指定PYTHON等变量的位置:
cmake ../ -DWITH_CUDA=OFF -DCMAKE_INSTALL_PREFIX=/opt/opencv-3.4.11
-DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON
-DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF
-DPYTHON3_EXECUTABLE=/home/rypan/miniconda3/envs/cv/bin/python3.8
-DPYTHON_INCLUDE_DIR=/home/rypan/miniconda3/envs/cv/include/python3.8
-DPYTHON_LIBRARY=/home/rypan/miniconda3/envs/cv/lib/libpython3.8.so
-DPYTHON3_NUMPY_INCLUDE_DIRS=/home/rypan/miniconda3/envs/cv/lib/python3.8/site-packages/numpy/core/include
-D CMAKE_INSTALL_PREFIX
为自己指定的安装位置,-D
是指定CMAKE参数时的前缀;其他参数的解释:https://docs.opencv.org/3.4.11/d7/d9f/tutorial_linux_install.html
上面PYTHON的可执行路径,库位置,NUMPY位置等,可能每个人都不同,所以可以先在自己的路径下找找看。
CMAKE执行完毕后,可以看看output结果,看看有无明显的错误。
Step IV: MAKE
# 执行make编译,-j8参数表示允许cpu并行编译,最多允许8个线程,可以大大加速构建过程
# -j根据自己cpu核心数设定,6核可以设为-j6~-j12
make -j8
# 安装编译好的可执行文件
sudo make install
完成后,自己选择的安装目录是/opt/opencv-3.4.11
,可以查看一下这个目录下应该有三个文件夹bin/ lib/ share/
Step V: 设置扫描路径和环境变量
由于是自定义位置安装,所以我们需要手动配置从而让系统识别。
通过/usr/bin/下的pkg-config命令,会扫描所有系统/usr/lib/下和环境变量PKG_CONFIG_PATH所定义的所有pkgconfig文件夹,这些文件夹都是存放各个程序编译信息.pc文件,pkg-config扫描后,这些.pc文件保存的编译信息就能被其他项目/程序获取。(.pc文件主要定义了安装程序的主目录prefix、可执行程序目录exec_prefix、lib目录libdir、包含目录includedir、sharedlibdir等,有点类似于环境变量,不过更多是为了程序编译服务的)
这时,有两种方法:1. 把编译生成的opencv.pc
放到系统的PKG-CONFIG文件夹下;2. 把生成的opencv.pc
文件的路径添加到PKG-CONFIG-PATH
METHOD 1
$ whereis pkg-config
pkg-config: /usr/bin/pkg-config /usr/lib/pkg-config.multiarch /usr/share/man/man1/pkg-config.1.gz
$ whereis pkgconfig
pkgconfig: /usr/lib/x86_64-linux-gnu/pkgconfig /usr/lib/pkgconfig /usr/share/pkgconfig
$ pkg-config --variable pc_path pkg-config
/usr/local/lib/x86_64-linux-gnu/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig
理论上可以将opencv.pc复制到任意一个pkg-config --variable pc_path pkg-config
列出的pkgconfig文件夹中。经过实验,在上面的路径中,/usr/lib/pkgconfig
,/usr/lib/x86_64-linux-gnu/pkgconfig
等都可以,我们编译生成的opencv.pc
文件在/opt/opencv-3.4.11/
下。原文中说:不过最好复制到/usr/local/lib/pkgconfig/
下,这个自己没有实验过。
Ubuntu18.04安装后,系统自带了opencv3.2.0,默认将opencv.pc存放在/usr/lib/x86_64-linux-gnu/pkgconfig/下,如果需要将opencv.pc复制到这里,可以先将系统自带的opencv.pc备份下,然后再cp过去。
METHOD 2
#修改bash.bashrc文件
sudo vim /etc/bash.bashrc
# 在最后加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/opencv-3.4.11/lib/pkgconfig
export PKG_CONFIG_PATH
# 使生效
source /etc/bash.bashrc
#查看变量是否生效
echo $PKG_CONFIG_PATH
Step VI: 设置环境变量
自定义位置编译时,可能会出现一种情况,编译成功安装成功,OpenCV的c++demo也可以正常运行,但是进入python环境import cv2时会发现找不到包。因为自定义编译时,生成的cv2模块路径是:
/OPENCV_DIR_PATH/lib/python3.8/site-packages
需要将此路径设置加入环境变量PYTHONPATH中,以便于python环境中import时可以找到cv2。
# 新增PYTHONPATH环境变量
sudo vim ~/.bashrc
# 在后面加入
export PYTHONPATH=$PYTHONPATH:/opt/opencv-3.4.11/lib/python3.8/site-packages
source ~/.bashrc
Step VII: 配置lib/
路径
将opencv的lib路径添加到配置,能被系统扫描到,有什么用?其他项目,如darknet构建时需要用到opencv的lib,就可以直接引用到。
sudo vim /etc/ld.so.conf.d/opencv.conf
# 添加opencv的lib位置
/opt/opencv-3.4.11/lib
# 刷新lib库目录
sudo ldconfig
# 刷新目录缓存
sudo /sbin/ldconfig
Step VIII: 验证
通过版本号验证
$ pkg-config opencv --modversion
# python
>>import cv2 as cv
>>cv.__version__
编译C++ DEMO
cd opencv-3.4.11/samples/cpp/example_cmake
cmake .
make
./opencv_example
Step IX: 卸载
直接在CMAKE的build目录下,sudo make uninstall
,将opencv相关的可执行文件、lib文件等从安装位置删除,不过还是会留空下文件夹,需要手动删除。
可以继续执行:sudo make clean
将源码包内的编译相关文件删除、最后在build文件夹内执行sudo rm rf *
删除源码包内所有文件