最近更新于 2023-06-04 21:43

环境

  • Ubuntu 22.04(Windows 11 22H2 专业工作站版 WSL2)

注:

  • 需要魔法,否则配置编译时依赖下载失败,编译会出错
  • 内存不足 3G 的建议设置交换分区(https://blog.iyatt.com/?p=1803 ),否则内存不足时编译进程会被杀死。我是按 CPU 总核心数指定的编译线程,在 8 线程下编译,我测试结果是给到 7GB 内存才没被杀死(无桌面版系统),有桌面的那得更高,所以也可以通过手动降低线程数来降低内存消耗。
  • 需要 CUDA 加速支持的话,参考安装驱动、CUDA、cuDNN:https://blog.iyatt.com/?p=2224
  • 编译安装的意义:使用 apt 安装的 C++ 版无法选择版本,使用 pip 安装的 Python 版对于专利算法默认是没有编译的支持的,如果不需要使用到专利保护期内的算法接口,那可以直接用 pip 安装:pip3 install opencv-python opencv-contrib-python

操作

准备

安装依赖

sudo apt update
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libatlas-base-dev gfortran libgtk2.0-dev libjpeg-dev libpng-dev libgtk-3-dev libdc1394-dev libtesseract-dev libtiff-dev libatlas-base-dev libdw-dev libunwind-dev libgmp-dev libgsl-dev libgslcblas0 flex bison libgst-dev libcap-dev build-essential cmake git pkg-config ffmpeg libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libvulkan-dev libvulkan1 mesa-vulkan-drivers vulkan-tools

这里安装的时 C++ 和 Python 版本的,在依赖安装中已经安装了 C++ 编译器,Python 解释器可以使用 apt 安装,也可以编译安装指定版本的(https://blog.iyatt.com/?p=1784 ),这里是指定编译的 Python 3.11.3

然后给 Python 安装一下 Numpy 模块

pip3 install numpy==1.24.3

克隆 OpenCV 源码(附加扩展库)

这里是安装 4.7.0,换其它版本也行,但是基础库和扩展库版本一定要一样

git clone https://github.com/opencv/opencv.git --branch 4.7.0 --depth=1
cd opencv
git clone https://github.com/opencv/opencv_contrib.git --branch 4.7.0 --depth=1

配置编译

可选:

  • 编译静态库(默认是动态库):加上参数 -DBUILD_SHARED_LIBS=OFF
  • CUDA 加速:如果配置了 CUDA 环境,加上参数:-DWITH_CUDA=ON

开启魔法上网,配置编译

mkdir build && cd build

cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-DOPENCV_ENABLE_NONFREE=ON \
-DBUILD_TESTS=OFF \
-DBUILD_FAT_JAVA_LIB=OFF \
-DBUILD_EXAMPLES=OFF \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DWITH_VULKAN=ON ..

编译安装

-j$(nproc) 就是按照 CPU 实际的核心总数来指定编译线程数

make -j$(nproc)
sudo make install

配置环境变量

sudo bash -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
sudo bash -c 'echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig" >> /etc/bash.bashrc'
sudo bash -c 'source /etc/bash.bashrc'

测试

C++

file

Python

file

使用提示

DNN 加速支持

net 为 DNN 模块加载的模型对象

CUDA

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

Vulkan

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_VKCOM)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_VULKAN)

OpenCL

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_OPENCL)

动态库打包

默认编译的是 OpenCV 动态库,编译时不会把库中的代码链接到可执行文件中,在编译的程序移动到没有配置环境的电脑上时就没法运行,需要把依赖的动态库一起打包。
参考:https://blog.iyatt.com/?p=5832