本文以Ubuntu(适用于18,20,22版本,其他的未进行测试)为例,介绍了编译安装OpenCV的最佳实践。其他平台比如windows,只需要参考本文的思路做稍微调整即可。
一、为什么需要编译安装OpenCV
如果没有特别的要求,采用命令行方式,就可以快速的进行OpenCV的安装。
sudo apt-get install libopencv-dev
sudo apt-get install python3-opencv
sudo apt-get install libopencv-contrib-dev
采用pip方式安装脚本如下
pip install opencv-python opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple
这样安装的OpenCV基本可以满足一般的开发需求,但是也存在以下的不足:
(1)安装的OpenCV不是最新的版本,尤其是contrib版本变化很快,部分最新的功能(有些新的背景提取,跟踪算法)会有所缺失。
(2)没有CUDA加速支持。
(3)如果apt不支持特定的CPU(比如arm)或者操作系统,就只能编译安装了。
如果我们的开发正好需要以上能力,建议通过源码编译方式安装。
二、OpenCV+CUDA有什么用处
OpenCV支持通过GPU实现CUDA加速执行,实现对OpenCV图像处理程序的加速运行,当前支持加速的模块包括如下:
- 图像背景分割
- 视频编解码
- 特征2D
- 卷积滤波
- 图像处理
- 对象检测
- 光流
- 双目视觉
- ...
在程序中调用CUDA也比较简单,这里先看看示例代码,基本上和在CPU上的图形操作函数类似,只是使用了CUDA模块内的函数。关于OpenCV+CUDA以后会专门展开进行说明。
Size mosaicSize(100, 100); // 调整后的大小
cv::cuda::resize(GpuFrame, GpuFrame, mosaicSize, 1, 0, 0); // 使用CUDA缩放图片
如果代码中没有cuda支持的需要,就没必要安装cuda模块了。
三、踩坑点
(1)不要在conda环境下编译安装
由于conda环境修改了部分环境变量,编译安装OpenCV过程中,经常发生冲突,我踩了不少坑,才发现这个问题。切记切记,不要在conda环境下编译安装。如果已经安装了conda,建议将 ~/.bashrc文件中以下内容注释。
gedit ~/.bashrc
注释以下内容
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/chen/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/home/chen/anaconda3/etc/profile.d/conda.sh" ]; then
. "/home/chen/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/home/chen/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
(2)需要从git上下载部分文件和模型
使用源码编译过程中,有些模块需要从git下载部分模型和一系列文件,由于网络的原因,这些下载基本都会超时,导致编译失败。
我在这里提供一个已经打包好的OpenCV4.8包,包括了源码和下载文件。直接按照后面的安装脚本步骤一步一步执行就可以了。无需联网下载文件。
共享链接:
https://pan.baidu.com/s/12qlrU8znVqQWm4_Mv69HHA
提取码: kugj
本共享长期有效。如果失效,烦请留言或者私信,重新发送地址。
四、保姆级编译安装步骤
(1)创建OpenCV4.8目录(可以是别的名字,不要包括中文),在该目录中,将百度网盘下载的OpenCV源码(包括opencv.zip和opencv_contrib.zip)分别解压到各自目录中。cmake.txt是cmake的命令行,可以下载后作为参考。
(2)在OpenCV4.8目录中创建一个build目录。创建后的目录结构如下。以后的所有操作都在build目录中进行!!!
(3)安装依赖文件
我是都安装了。假如自己了解各个模块的作用,可以进行取舍。根据自己的情况少装,或者不装部分包。
sudo apt install make gcc cmake build-essential
sudo apt install libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt install ffmpeg
(4)cmake预编译
-D WITH_CUDA=1表示带CUDA的编译。其他的编译选项如果不是很了解,可以不用动。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -D WITH_CUDA=1 -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D OPENCV_GENERATE_PKGCONFIG=1 ../opencv
(5)make编译
-j8表示用8个线程编译,可以根据CPU能力改为-j4,-j16等等。根据机器情况不同,编译大约需要1-2个小时
编译过程如果有需要,可以随时用ctrl+C中断,然后重新执行make命令,编译工作从中断的地方继续,不会有任何影响。
make -j8
(6)安装编译文件
将编译后的文件安装在 CMAKE_INSTALL_PREFIX 指定的目录中
sudo make install
(7)大功告成。