版本选择

OpenCV 4.5.x

OpenCV 4.5.x 系列是 OpenCV 4 的一个重要里程碑。

  • DNN 模块的革命性改进:这是 4.5 系列最大的亮点。它增加了对 ONNXTensorFlow Lite 模型格式的支持,并集成了像 Intel OpenVINO 这样的硬件加速后端,显著提升了深度学习模型的推理性能。
  • G-API 模块的增强:Graph API 模块得到了进一步的完善,使得构建复杂的图像处理流水线变得更加高效和灵活。
  • 稳定性与性能优化:整个系列都在持续修复 bug 并优化代码,为后续版本打下了坚实的基础。

OpenCV 4.6.0

这个版本专注于提升性能和兼容性。

  • 更好的硬件加速:强化了对一些特定硬件平台的加速支持,例如针对一些移动端和嵌入式设备的优化。
  • CMake 和构建系统的改进:构建流程变得更加顺畅和可靠。

OpenCV 4.7.0

这个版本在 DNN 模块和算法上都有不错的更新。

  • DNN 模块持续演进:修复了 DNN 模块中的 bug,并提升了对某些模型的兼容性。
  • 图像处理算法更新:新增和优化了一些图像处理算法,提高了精度或速度。

OpenCV 4.8.0

这个版本主要是一些 bug 修复和新功能的初步引入。

  • 新模块或新功能预览:可能引入了一些实验性的新功能,通常在后续版本中会进行完善。

OpenCV 4.9.0

与 4.8.0 类似,这个版本主要进行维护性更新。

  • 错误修复和稳定性提升:解决了社区反馈的许多问题,让库变得更加健壮。

OpenCV 4.10.0 到 4.12.0

OpenCV 团队在 4.x 系列的后期,通常会把重心放在以下几个方面:

  • 持续的 DNN 优化:这几乎是每个新版本都会做的事情。团队会不断优化 DNN 模块的性能,并增加对更多新兴模型和算子的支持。
  • G-API 的扩展:G-API 模块会持续添加新的后端和功能。
  • 社区贡献的整合:集成来自社区的新算法和性能优化,让整个库更加全面。
  • 兼容性更新:确保与最新的编译器、操作系统和硬件平台兼容。

建议使用哪个版本?

综合来看,强烈建议使用 OpenCV 4.12.0,或至少是 4.10.0 之后的版本

原因很简单:

  1. 更强的 DNN 性能:如果你需要处理深度学习任务,越新的版本意味着更好的模型兼容性、更少的 bug 和更高的推理速度。
  2. 更高的稳定性:所有后期版本都包含了对前期版本已知 bug 的修复。这可以节省你在项目开发中调试和排查问题的时间。
  3. 更好的生态支持:许多新的硬件加速库、操作系统和开发工具都倾向于支持最新版本的 OpenCV。

除非你的项目有特殊的依赖,必须使用特定版本,否则总是选择最新的稳定版本是最佳实践。

注:

  • 构建版本名中如果带 headless 指的是“无图形界面”的构建,适合服务器等无 GUI 环境。

编译

Note

假设你的目录结构如下:

/some_path
├── opencv
└── opencv_contrib

构建依赖

核心构建工具

这些是编译软件所必需的基本工具。

sudo apt update
sudo apt install build-essential cmake pkg-config

图像和视频 I/O 库

这些库用于处理各种图像和视频文件格式,如 JPEG、PNG、TIFF、MP4 等。

sudo apt install libjpeg-dev libpng-dev libtiff-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

GUI 和显示库

这些库用于支持 OpenCV 的图形界面功能,如 cv::imshow()

sudo apt install libgtk-3-dev libqt5-dev

优化和加速库

这些库是实现我们之前讨论的高性能优化的关键。

  • TBB (Threading Building Blocks):
    sudo apt install libtbb-dev
  • CUDA (如果你的系统有 NVIDIA GPU):
    • 你需要从 NVIDIA 官网下载并安装 CUDA ToolkitcuDNN
    • 注意: 确保你的驱动版本与 CUDA Toolkit 版本兼容。
  • IPP (Integrated Performance Primitives):
    • 这个库通常是 Intel MKL 的一部分。你可以在 CMake 命令中通过 -D WITH_IPP=ON 来启用它,如果它已安装。
  • OpenBLAS / Eigen (可选):
    • 这些库可以为矩阵运算提供额外的性能优化。
    sudo apt install libopenblas-dev libeigen3-dev

Python 支持

如果你计划在 Python 中使用 OpenCV,还需要安装以下依赖。

sudo apt install python3-dev python3-pip
pip3 install numpy

编译选项

为了最大化性能,我们需要确保 OpenCV 能够利用你系统上的各种硬件加速功能。这主要包括使用优化的处理器指令集、GPU 加速以及启用特定的库和模块。我们将通过配置 CMake 来完成这些设置。

以下是一组核心编译选项,它们将显著提升 OpenCV 的性能:

  • 启用优化的 CPU 指令集:利用你 CPU 支持的最新指令集(如 SSE、AVX、AVX2 和 AVX512),可以大大加速图像处理算法。
  • 启用 GPU 加速:如果你的系统有 NVIDIA GPU,可以使用 CUDA 框架进行加速。这是最显著的性能提升之一。
  • 链接高性能外部库:使用如 TBB(Threading Building Blocks)进行多线程并行计算,以及使用 Intel IPP(Integrated Performance Primitives)库来加速图像处理。
  • 启用和禁用特定模块:启用你需要的模块(例如 contrib 模块中的一些高级算法),并禁用不需要的模块以减少编译时间和最终库的大小。

推荐的编译指令

下面是一个完整的 CMake 命令行示例,你可以直接复制并粘贴到终端中。我会逐一解释每个选项的用途。

cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=/opt/opencv \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
      -D OPENCV_GENERATE_PKGCONFIG=ON \
      -D OPENCV_ENABLE_NONFREE=ON \
      -D WITH_TBB=ON \
      -D WITH_IPP=ON \
      -D WITH_V4L=ON \
      -D WITH_V4L2=ON \
      -D WITH_OPENGL=ON \
      -D WITH_QT=ON \
      -D WITH_GTK_V3=ON \
      -D WITH_CUDA=ON \
      -D WITH_CUDNN=ON \
      -D WITH_CUSOLVER=ON \
      -D OPENCV_DNN_CUDA=ON \
      -D ENABLE_FAST_MATH=ON \
      -D CUDA_FAST_MATH=ON \
      -D WITH_CUBLAS=ON \
      -D WITH_FFMPEG=ON \
      -D BUILD_opencv_python3=ON \
      -D BUILD_EXAMPLES=ON \
      -D BUILD_PERF_TESTS=OFF \
      -D BUILD_TESTS=OFF \
      -D BUILD_SHARED_LIBS=ON \
      ..

选项详解

下面是这些选项的详细说明,帮助你理解为什么选择它们以及它们如何影响性能。

  • -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules
    • 作用: 这是最关键的一步。它告诉 CMake 到哪里去查找 opencv_contrib 的额外模块。我们使用相对路径 ../../opencv_contrib/modules,假定你当前位于 opencv/build 目录,而 opencv_contrib 位于 opencv 目录的同级。
  • -D CMAKE_BUILD_TYPE=Release

    • 作用: 以发布模式编译。这会启用最高级别的编译器优化,例如 -O3,从而生成最高效的二进制文件。这是获得高性能的最基本要求。
  • -D CMAKE_INSTALL_PREFIX=/usr/local

    • 作用: 指定安装路径。这是一个标准路径,你可以根据需要更改。
  • -D OPENCV_GENERATE_PKGCONFIG=ON

    • 作用: 生成 .pc 文件,方便其他项目通过 pkg-config 找到 OpenCV 的头文件和库路径。
  • -D OPENCV_ENABLE_NONFREE=ON

    • 作用: 启用一些受专利保护的算法,例如 SIFT 和 SURF。如果你的项目需要这些算法,这是必须的。
  • -D WITH_TBB=ON

    • 作用: 启用英特尔的 Threading Building Blocks。这是一个高性能的多线程库,能让 OpenCV 的并行算法跑得更快。
  • -D WITH_IPP=ON

    • 作用: 启用英特尔的 Integrated Performance Primitives。这是一个用于图像和信号处理的库,可以显著加速一些核心的 OpenCV 函数。
  • -D WITH_CUDA=ON -D WITH_CUDNN=ON -D WITH_CUSOLVER=ON -D WITH_CUBLAS=ON -D OPENCV_DNN_CUDA=ON -D ENABLE_FAST_MATH=ON -D CUDA_FAST_MATH=ON

    • 作用: 启用 NVIDIA CUDA 加速。如果你的系统有 NVIDIA 显卡,这些选项是关键。它们允许 OpenCV 使用 GPU 进行矩阵运算、深度学习推理等任务,性能提升非常显著。CUDNNCUBLAS 是深度学习和线性代数库,而 FAST_MATH 选项则牺牲一点精度来换取更快的计算速度。
  • -D WITH_FFMPEG=ON

    • 作用: 启用 FFMPEG 库。这使得 OpenCV 可以处理各种视频文件,并支持更多格式的编解码。
  • -D BUILD_opencv_python3=ON

    • 作用: 如果你打算在 Python 3 中使用 OpenCV,这个选项是必需的。
  • -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF

    • 作用: 禁用性能和功能测试的编译。这会缩短编译时间,因为你不需要运行这些测试。在发布版本中,通常不需要编译它们。
  • -D BUILD_SHARED_LIBS=ON

    • 作用: 编译动态链接库(.so.dll 文件)。这比静态库更灵活,是大多数情况下的首选。

多版本管理及链接

在系统中管理多个 OpenCV 版本需要配置环境变量,以确保项目能正确链接到所需的版本。以下说明将帮助你配置 C++ 和 Python 项目,使其能够找到并使用你安装在 /opt/opencv 下的 OpenCV 版本。

C++ 项目:Pkg-config 配置

pkg-config 是一个用于获取已安装库的编译和链接选项的工具。为了让它找到新版本,你需要更新环境变量 PKG_CONFIG_PATH

  1. 临时配置:如果你只想在当前终端会话中使用新版本,可以在终端中运行以下命令:

    export PKG_CONFIG_PATH=/opt/opencv/lib/pkgconfig:$PKG_CONFIG_PATH
  2. 永久配置:如果你希望此配置在每次登录时都生效,可以将该行代码添加到你的 shell 配置文件中,例如 ~/.bashrc~/.zshrc

    echo 'export PKG_CONFIG_PATH=/opt/opencv/lib/pkgconfig:$PKG_CONFIG_PATH' >> ~/.bashrc
    source ~/.bashrc

    添加后,任何使用 pkg-config --cflags --libs opencv4 的项目都会自动链接到 /opt/opencv 下的库。

C++ 项目:CMake 配置

在你的 CMakeLists.txt 文件中,你可以直接指定 OpenCV 的安装路径,这对于需要特定版本的项目特别有用。

find_package 命令之前添加以下代码:

set(OpenCV_DIR "/opt/opencv/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
 
# 现在你可以正常使用 OpenCV 库
target_link_libraries(your_project_name ${OpenCV_LIBS})

通过这种方式,即使 PKG_CONFIG_PATH 没有设置,CMake 也能找到正确的库。

Python 项目

要让 Python 解释器找到你新编译的 OpenCV,你需要确保其库路径在 PYTHONPATH 环境变量中。

  1. 查找库文件:在 /opt/opencv 目录下,你可以在 lib/python3.x/dist-packages 找到 cv2.cpython-xxx.so(或类似的)文件。

  2. 临时配置:在当前终端会话中运行:

    export PYTHONPATH=/opt/opencv/lib/python3.x/dist-packages:$PYTHONPATH

    请将 python3.x 替换为你的 Python 版本,例如 python3.8

  3. 永久配置:将该行添加到 ~/.bashrc~/.zshrc 文件中。

    echo 'export PYTHONPATH=/opt/opencv/lib/python3.x/dist-packages:$PYTHONPATH' >> ~/.bashrc
    source ~/.bashrc

    配置完成后,你可以在 Python 脚本中导入 cv2,并且它将从你新安装的位置加载。

通过上述方法,你可以轻松地在同一系统上管理和使用不同版本的 OpenCV,并根据项目需求灵活切换。