跳到主要内容

OpenCV 源码编译全总结

OpenCV 是一个跨平台计算机视觉的开源库,实现了很多图像处理和计算机视觉方面的通用算法

官网虽然提供了预编译好的文件,但是想要使用 contrib 拓展模块或者是 CUDA 的 GPU 支持,就需要从源码编译

Windows篇 ==== Linux篇

Windows

  • 软件版本
nameversion
SystemWindows 10 22H2
CMake-GUIv3.24.3
OpenCVv4.7.0
OpenCV-Contribv4.7.0
Opencv_Extrav4.7.0
Visual Studio2022
(可选)CUDAv12.0
(可选)CUDNNv8.8.1

安装 CUDA/CUDNN

这一步仅针对有 NVIDIA GPU 的设备,不需要则跳转到 获取源码

下载 CUDA 离线安装包

选择解压目录,解压完成后开始安装,默认安装路径为

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0

  • v12.0 为你所选的 CUDA 版本

安装完成后 CUDA 目录会被添加到环境变量,如果没有被添加,手动添加到系统 path 变量中

cmd 中使用 nvcc -V 查看 CUDA 版本信息,验证安装

下载 CUDNN 文件压缩包

解压后如下

将除 LICENSE 外的文件全都复制到 CUDA 的安装路径下,如果是默认安装位置,则为 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0

验证 CUDA & CUDNN 安装

打开 cmd 进入 CUDA 安装目录的 extras\demo_suite 目录

cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0\extras\demo_suite

输入 bandwidthTest.exe 进行验证

输入 deviceQuery.exe 进行验证

都输出 Result = PASS 则安装完成

获取源码

nameversion
OpenCVv4.7.0
OpenCV-Contribv4.7.0

解压后放在同一目录下,新建 build 文件夹

  • build 文件夹用来存放编译后的文件,可以任意命名

配置 CMake 项目

打开 CMake-GUI 分别填入 build 文件夹路径以及 opencv-4.7.0 源码路径

然后点击 Configure 选择 Visual Studio 版本

会出现类似如下的红色提示

原因是 CMake 在配置时会需要下载一些依赖,但是由于网络原因,导致依赖无法下载,根据提示,可以看到链接不到的网址为

=======================================================================
Couldn't download files from the Internet.
Please check the Internet access on this host.
=======================================================================

CMake Warning at cmake/OpenCVDownload.cmake:248 (message):
IPPICV: Download failed: 6;"Couldn't resolve host name"

For details please refer to the download log file:

E:/workspace/temp/build/CMakeDownloadLog.txt

Call Stack (most recent call first):
3rdparty/ippicv/ippicv.cmake:37 (ocv_download)
cmake/OpenCVFindIPP.cmake:259 (download_ippicv)
cmake/OpenCVFindLibsPerf.cmake:12 (include)
CMakeLists.txt:750 (include)

根据输出信息,找到 opencv-4.7.0\3rdparty\ippicv\ippicv.cmake 文件位置

修改 https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/ 中的 raw.githubusercontent.com

将 url 修改为 https://raw.fastgit.org/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

信息

下面两个文件加速CDN可选

  1. Github RAW 加速服务
  2. Fast Git

1 中不支持 .(zip|rar|7z|apk|ipa|exe|msi|m3u|m3u8|mp4|mp3) 等文件类型的加速

再次 Configure 发现 ippicv 下载成功

但是依然出现 FFMPEG: Download failed: 6;"Couldn't resolve host name" 的错误提示,按前面的方式修改 url 后继续 Configure

错误信息全部清除后将出现

设置 CMake 构建选项

添加完设置后都重新 Configure

添加 OpenCV-Contrib 路径

  • OPENCV_EXTRA_MODULES_PATH 填入 opencv_contrib-4.7.0/modules 路径

同样出现一些文件下载失败的警告,按照之前的方式,修改 url 清除全部警告

  • [可选] 开启 CUDA 支持

  • [可选] 编译 CUDA 支持的 Python 包

如果启用了 anaconda 环境,则需要将对应的 python lib 路径设置为正确的路径

Visual Studio 执行编译

Linux

  • 软件版本
nameversion
SystemUbuntu 20.04.5 LTS
CMake-GUIv3.24.3
OpenCVv4.7.0
OpenCV-Contribv4.7.0
Opencv_Extrav4.7.0
(可选)CUDAv12.0
(可选)CUDNNv8.8.1

获取 OpenCV 源码

下载完成后解压

tar zxvf opencv-4.7.0.tar.gz ~/workspace/opencv/4.7.0/
tar zxvf opencv_contrib-4.7.0.tar.gz ~/workspace/opencv/4.7.0/
tar zxvf opencv_extra-4.7.0.tar.gz ~/workspace/opencv/4.7.0/

安装各种依赖

sudo apt-get install \
build-essential \
cmake \
git \
libgtk2.0-dev \
pkg-config \
libavcodec-dev \
libavformat-dev \
libswscale-dev \
libtbb2 \
libtbb-dev \
libjpeg-dev \
libpng-dev \
libtiff-dev \
libdc1394-22 \
libglew-dev \
zlib1g-dev \
libavutil-dev \
libpostproc-dev \
libeigen3-dev \
libopenexr-dev \
libwebp-dev \
libgtk-3-dev \
qtbase5-dev \
libgstreamer1.0-dev \
libgstreamer-plugins-base1.0-dev
  • libjasper-dev
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper-dev

编译

新建 build/ 目录存放编译生成的文件

cd ~/workspace/opencv/4.7.0/;mkdir build;cd build
  • [可选] 配置并生成 makefile 过程中会下载一些依赖内容,建议开启网络代理
export http_proxy=socks5://127.0.0.1:7890;export https_proxy=socks5://127.0.0.1:7890;export all_proxy=socks5://127.0.0.1:7890
  • [可选] 如果你的 Python 环境使用 Anaconda 或者是其他的 python 环境管理应用,记得启用你的虚拟环境,这里会配置 python 包的路径,编译支持 CUDA 的 opencv-python 版本

配置 cmake 参数,修改 opencv_extraopencv_contrib 的路径

cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_GENERATE_PKGCONFIG=YES \
-DWITH_QT=ON \
-DWITH_OPENGL=ON \
-DWITH_TBB=ON \
-DWITH_OPENCL=ON \
-DWITH_FFMPEG=ON \
-DWITH_CUDA=ON \
-DOPENCV_DNN_CUDA=ON \
-DCUDA_ARCH_BIN=5.0,5.2,6.0,6.1,7.0,7.5,8.0,8.6,8.9,9.0 \
-DENABLE_FAST_MATH=ON \
-DCUDA_FAST_MATH=ON \
-DWITH_CUBLAS=ON \
-DWITH_GTK=ON \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-DCUDA_ARCH_PTX="" \
-DINSTALL_TESTS=ON \
-DBUILD_WITH_DEBUG_INFO=ON \
-DBUILD_opencv_python3=ON \
-DPYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") \
-DPYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-DPYTHON3_LIBRARY=$(python3 -c "from distutils.sysconfig import get_config_var;from os.path import dirname,join ; print(join(dirname(get_config_var('LIBPC')),get_config_var('LDLIBRARY')))") \
-DOPENCV_TEST_DATA_PATH=../opencv_extra-4.7.0/testdata \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.7.0/modules \
../opencv-4.7.0

生成完之后开始编译

NUM_CPU=$(nproc)
make -j$(($NUM_CPU - 1))

等待编译完成后

sudo make install

测试安装

pkg-config --libs opencv4

测试 opencv-python 安装

python -c "import cv2;print(cv2.getBuildInformation())"