最近更新于 2024-05-05 14:19
环境
- 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++
Python
使用提示
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
OpenCV 编译安装