版本选择
OpenCV 4.5.x
OpenCV 4.5.x 系列是 OpenCV 4 的一个重要里程碑。
- DNN 模块的革命性改进:这是 4.5 系列最大的亮点。它增加了对 ONNX 和 TensorFlow 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 之后的版本。
原因很简单:
- 更强的 DNN 性能:如果你需要处理深度学习任务,越新的版本意味着更好的模型兼容性、更少的 bug 和更高的推理速度。
- 更高的稳定性:所有后期版本都包含了对前期版本已知 bug 的修复。这可以节省你在项目开发中调试和排查问题的时间。
- 更好的生态支持:许多新的硬件加速库、操作系统和开发工具都倾向于支持最新版本的 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-devGUI 和显示库
这些库用于支持 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 Toolkit 和 cuDNN。
- 注意: 确保你的驱动版本与 CUDA Toolkit 版本兼容。
- IPP (Integrated Performance Primitives):
- 这个库通常是 Intel MKL 的一部分。你可以在 CMake 命令中通过
-D WITH_IPP=ON来启用它,如果它已安装。
- 这个库通常是 Intel MKL 的一部分。你可以在 CMake 命令中通过
- 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目录的同级。
- 作用: 这是最关键的一步。它告诉 CMake 到哪里去查找
-
-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 进行矩阵运算、深度学习推理等任务,性能提升非常显著。
CUDNN和CUBLAS是深度学习和线性代数库,而FAST_MATH选项则牺牲一点精度来换取更快的计算速度。
- 作用: 启用 NVIDIA CUDA 加速。如果你的系统有 NVIDIA 显卡,这些选项是关键。它们允许 OpenCV 使用 GPU 进行矩阵运算、深度学习推理等任务,性能提升非常显著。
-
-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。
-
临时配置:如果你只想在当前终端会话中使用新版本,可以在终端中运行以下命令:
export PKG_CONFIG_PATH=/opt/opencv/lib/pkgconfig:$PKG_CONFIG_PATH -
永久配置:如果你希望此配置在每次登录时都生效,可以将该行代码添加到你的 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 环境变量中。
-
查找库文件:在
/opt/opencv目录下,你可以在lib/python3.x/dist-packages找到cv2.cpython-xxx.so(或类似的)文件。 -
临时配置:在当前终端会话中运行:
export PYTHONPATH=/opt/opencv/lib/python3.x/dist-packages:$PYTHONPATH请将
python3.x替换为你的 Python 版本,例如python3.8。 -
永久配置:将该行添加到
~/.bashrc或~/.zshrc文件中。echo 'export PYTHONPATH=/opt/opencv/lib/python3.x/dist-packages:$PYTHONPATH' >> ~/.bashrc source ~/.bashrc配置完成后,你可以在 Python 脚本中导入
cv2,并且它将从你新安装的位置加载。
通过上述方法,你可以轻松地在同一系统上管理和使用不同版本的 OpenCV,并根据项目需求灵活切换。