如何配置 OpenCV 的开发环境

在 Ubuntu 20.04.6 LTS 中配置 OpenCV 4.9.0 的开发环境

由 Anawaert 与 EverGlow 于 2024-07-09 发布   

概述

  OpenCV 是世界上最大的开源计算机视觉算法库,其包含了海量的计算机视觉、机器学习与高等数学计算相关的代码。而为了使用这个“重量级”的算法库,需要我们在安装前,在操作系统中进行充分的配置。本文将以 Ubuntu 20.04.6 LTS 为例,演示如何在 Linux 上安装 OpenCV 4.9.0 。为了演示最普遍的情况,本文将同时介绍 CPU 版的 OpenCV 的安装与具有 NVIDIA CUDA 加速的 OpenCV 的安装,并使用从源代码编译安装的方法,您可以根据操作系统所在计算机的实际硬件情况进行选择。

附 笔者安装 OpenCV 环境使用的计算机情况:

  • CPU: Intel(R) Core i9-13900HX x 32
  • GPU: NVIDIA GeForce RTX 4080 Laptop 12G
  • RAM: SAMSUNG DDR5-5600MHz 16GB × 2
  • OS: Ubuntu 20.04.6 (Desktop) LTS

安装流程

安装前准备

下载 OpenCV 与 OpenCV-Contrib 源代码

  访问 OpenCV 官网,在顶栏中找到“Library”,再在下拉框中选择“Releases”,即可进入 OpenCV 库的发行资源页:

OpenCV Website

  如图所示,点击“Sources”,下载 OpenCV 4.9.0 的源代码文件:

OpenCV 4.9.0 Source Download

  再访问 OpenCV-Contrib 版本标签页,点击与 OpenCV 版本相同的标签(在本文示例中,即为 4.9.0 ),然后下载源代码:

OpenCV Contrib Release Tags


OpenCV Contrib Download

  完成它们的下载后,请解压到一个合适的位置(如用户的主目录)以方便后续的操作。

Unzip OpenCV (Contrib) Libraries

检查 Python 版本

  在终端中输入如下命令以查看 Python 版本:

python3 --version

  此处务必注意:由于在编译安装具有 CUDA 加速的 OpenCV 时会同时安装 OpenCV-Python 模块,且该模块所属的 Python 解释器为我们手动指定的 Python 解释器,当您的系统中有多个 Python 解释器时,这可能会令人疑惑:“为什么我无法在 Python 中执行 import cv2 导入模块的操作?”因此,若您未来使用 Python 开发OpenCV,请务必确保该 Python 版本与其它用于视觉开发的组件兼容

  可能此时您仍不明白上述这段话的具体含义。在后面编译安装具有 CUDA 加速的 OpenCV 库的内容介绍中,相关内容会再次提及。

配置必要的安装依赖

  首先,将 apt 包管理器进行更新:

sudo apt-get update

  接着,使用 apt 包管理器安装以下内容:

sudo apt-get install build-essential cmake git ffmpeg libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libeigen3-dev libtheora-dev libvorbis-dev libxvidcore-dev libx264-dev sphinx-common yasm doxygen libfaac-dev libopencore-amrnb-dev libopencore-amrwb-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libavutil-dev libavfilter-dev libavresample-dev

  若您需要编译具有 NVIDIA CUDA 加速的 OpenCV ,则还需要安装 libjasper1 和 libjasper-dev 库。但如果想用 apt 安装它们,则需要进行一些额外设置(原文地址):

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt-get update
sudo apt-get install libjasper1 libjasper-dev

  此外,若您使用 Python 作为 OpenCV 的开发语言,则需要先安装 NumPy 以用于 OpenCV 的矩阵计算(在 OpenCV-Python 中,不使用 cv::Mat 类型作为矩阵容器,而是使用 numpy.ndarray)。以笔者为例,使用 pip 包管理器安装 1.23.5 版本的 NumPy:

pip install numpy==1.23.5

开始安装

安装使用 CPU 计算的 OpenCV

  重要提醒:若您需要 NVIDIA CUDA 加速,请跳过本节。本节与下一节并非顺序关系,请勿在安装使用 CPU 计算的 OpenCV 后再次安装使用 CUDA 加速版的 OpenCV

  首先,将命令行工作目录切换到刚才我们的解压缩的 OpenCV 源代码目录下:

Convert Directory to OpenCV Directory

  创建编译目录并进入:

mkdir ./build
cd ./build

Cvt Dir to Build Dir

  输入以下的 CMake 命令以进行编译预构建(请勿直接运行!请勿直接运行!请勿直接运行!):

cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=[your-contrib-path]/modules ..

  CMake 参数解读:

  • -D CMAKE_BUILD_TYPE=RELEASE:使用 Release 版进行编译
  • -D OPENCV_GENERATE_PKGCONFIG=YES:编译时生成 pkg 信息
  • -D CMAKE_INSTALL_PREFIX=/usr/local:OpenCV 的安装位置
  • -D OPENCV_EXTRA_MODULES_PATH=[your-contrib-path]/modules:OpenCV-Contrib 模块的路径,[your-contrib-path] 为先前的 OpenCV-Contrib 文件夹路径

  以笔者为例,上述的 CMake 编译参数为:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/owen/opencv_contrib-4.9.0/modules ..

  等待命令执行完成,若显示“配置完成”、“生成完成”(当然,是英语),则代表上述的 CMake 编译选项已起作用。

  运行以下命令以编译 OpenCV 源代码。请注意:-j 后的数字代表着编译所用的 CPU 线程数,若您清楚自己计算机 CPU 的线程数,可使用具体数字进行调整。

make -j$(nproc)

  编译时间很长很长,请耐心等候,不要打断。在编译完成后,使用下面的命令安装 OpenCV 库至系统:

sudo make install

Make Install Command

  安装完成后,验证安装可输入命令查看 pkg 包信息:

# bash
pkg-config --modversion opencv4 

Verify OpenCV Installation

  最后,安装匹配OpenCV版本的OpenCV-Python。首先打开终端,更新apt包管理器:

sudo apt-get update

  接着,使用 pip 包管理器安装 OpenCV(-Contrib)-Python ,用法如下:

sudo apt-get install python3-pip
# [your-opencv-version] 为您前面安装的 OpenCV 的版本
pip install opencv-python==[your-opencv-version]
pip install opencv-contrib-python==[your-opencv-version]

  以笔者的系统为例,具体的命令为:

sudo apt-get install python3-pip
pip install opencv-python==4.9.0.80
pip install opencv-contrib-python==4.9.0.80

Install OpenCV-Python

  等待安装完后,在终端中输入 pythonpython3 ,然后输入以下的 Python 语句以检验安装:

import cv2
print(cv2.__version__)  # 4.9.0

Check CPU Version OpenCV

安装具有 NVIDIA CUDA 加速的 OpenCV

  重要提醒:本节与上一节并非顺序关系,请勿在安装 CPU 版 OpenCV 后再次安装 GPU 版的 OpenCV!

  首先,请务必确保当前系统已正确安装 NVIDIA 显卡驱动、CUDA Toolkit 与 cuDNN 模块,这是安装具有 CUDA 加速的 OpenCV 的大前提。若您仍未完成上述的 GPU 配置,请参阅 如何在 Linux 上安装 GPU 驱动 ,本文不予赘述。

  在确保显卡驱动、CUDA Toolkit 与 cuDNN 模块后,在终端中将命令行工作目录切换到刚才我们的解压缩的 OpenCV 源代码目录下:

Convert Directory to OpenCV Directory

  创建编译目录并进入:

mkdir ./build
cd ./build

Cvt Dir to Build Dir

  输入 CMake 命令以进行编译预构建(请勿直接运行!请勿直接运行!请勿直接运行!):

cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=[your-contrib-path]/modules -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D WITH_CUBLAS=ON -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda -D OpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -D OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ -D OPENCV_PYTHON3_VERSION=[your-python-version] -D PYTHON_EXECUTABLE=[your-py-exec-path] -D PYTHON_DEFAULT_EXECUTABLE=[your-default-py-exec] -D PYTHON3_EXECUTABLE=[your-py3-exec-path] -D PYTHON3_INCLUDE_DIR=[your-py3-include-dir] -D PYTHON3_LIBRARY=[your-py3-lib-path] -D PYTHON3_PACKAGES_PATH=[your-py3-pkg-dir] -D PYTHON3_NUMPY_INCLUDE_DIRS=[your-numpy-include-dir] -D BUILD_EXAMPLES=ON ..

  CMake参数解读:

  • -D CMAKE_BUILD_TYPE=RELEASE:使用 Release 版进行编译
  • -D OPENCV_GENERATE_PKGCONFIG=YES:编译时生成 pkg 信息
  • -D CMAKE_INSTALL_PREFIX=/usr/local:OpenCV 的安装位置
  • -D OPENCV_EXTRA_MODULES_PATH=[your-contrib-path]/modules:OpenCV-Contrib 模块的路径,[your-contrib-path] 为先前的 OpenCV-Contrib 文件夹路径
  • -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON:启用 CUDA 、cnDNN 编译
  • -D WITH_CUBLAS=ON:启用 CUDA 的矩阵运算库
  • -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda:CUDA ToolKit 的根目录,一般不需要设置
  • -D OpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so:OpenCL 动态库的位置
  • -D OpenCL_INCLUDE_DIR=/usr/local/cuda/include/:OpenCL 的头文件目录
  • -D OPENCV_PYTHON3_VERSION=[your-python-version]:设置 OpenCV-Python 所用的 Python 版本,如 3.8
  • -D PYTHON_EXECUTABLE=[your-py-exec-path]:Python 的可执行文件所在位置
  • -D PYTHON_DEFAULT_EXECUTABLE=[your-default-py-exec]:Python 默认的可执行文件所在位置,一般同上
  • -D PYTHON3_EXECUTABLE=[your-py3-exec-path]:Python3 的可执行文件所在位置,若系统内无多个 Python 大版本,一般同上
  • -D PYTHON3_INCLUDE_DIR=[your-py3-include-dir]:Python3 的头文件目录
  • -D PYTHON3_LIBRARY=[your-py3-lib-path]:Python3 的动态链接库文件位置
  • -D PYTHON3_PACKAGES_PATH=[your-py3-pkg-dir]:Python3 包文件的目录
  • -D PYTHON3_NUMPY_INCLUDE_DIRS=[your-numpy-include-dir]:Python3 存放包文件的目录中,NumPy 包的头文件目录
  • -D BUILD_EXAMPLES=ON:生成 OpenCV 示例程序

  再次提醒:若您未来使用 Python 作为 OpenCV 的开发语言,请务必仔细核对 Python 版本,以避免 OpenCV-Python 与其它计算机视觉开发组件因为依赖不兼容而不兼容的情况

  比如,Ultralytics 模块中多个依赖模块与组件需要 Python 3.9,但是 Ubuntu 20.04.6 LTS 自带的 Python 版本为 Python 3.8,因此若您想在同一个 Python 项目中同时导入 cv2ultralytics 模块时,就需要考虑因 Python 语言版本不同所导致的兼容性问题了。关于如何系统更改 Python 版本,或使用虚拟环境来切换 Python 版本非本文核心内容,本文不予赘述,请自行查阅相关资料。笔者推荐使用 venv 与 Miniconda 来进行虚拟环境的搭建,并使用 Python 3.9 作为备选 Python 版本。本文演示的是在不考虑使用虚拟环境的情况下,OpenCV 库的编译安装流程

  请注意:所有与 Python 相关的 CMake 编译参数需要自己去寻找具体路径与位置,每个人的系统环境与环境情况不尽相同,请根据实际情况进行调整。以笔者为例,上述的 CMake 编译参数为:

cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/owen/opencv_contrib-4.9.0/modules -D WITH_CUDA=ON -D WITH_CUDNN=ON -D OPENCV_DNN_CUDA=ON -D WITH_CUBLAS=ON -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda -D OpenCL_LIBRARY=/usr/local/cuda/lib64/libOpenCL.so -D OpenCL_INCLUDE_DIR=/usr/local/cuda/include/ -D OPENCV_PYTHON3_VERSION=3.8 -D PYTHON_EXECUTABLE=/usr/bin/python3 -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3 -D PYTHON3_EXECUTABLE=/usr/bin/python3 -D PYTHON3_INCLUDE_DIR=/usr/include/python3.8 -D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so.1.0 -D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages -D PYTHON3_NUMPY_INCLUDE_DIRS=/home/owen/.local/lib/python3.8/site-packages/numpy/core/include -D BUILD_EXAMPLES=ON ..

  等待命令执行完成,若显示“配置完成”、“生成完成”(当然,是英语),则代表上述的 CMake 编译选项已起作用:

CMake Commands

  运行以下命令以编译 OpenCV 源代码。请注意:-j 后的数字代表着编译所用的 CPU 线程数,若您清楚自己计算机 CPU 的线程数,可使用具体数字进行调整。

make -j$(nproc)

Make -J Command


Make -J Done

  编译时间很长很长,请耐心等候,不要打断。在编译完成后,使用下面的命令安装OpenCV库至系统:

sudo make install

Make Install Command

  安装完成后,验证安装可输入命令查看以 pkg 信息:

pkg-config --modversion opencv4 

Verify OpenCV Installation

  由于我们在安装时已配置 OpenCV-Python ,因此无需再使用 pip 包管理器安装 OpenCV-Python 。在终端中,可直接输入 pythonpython3 并执行下面的 Python 代码以检验安装:

import cv2
print(cv2.__version__)  # 4.9.0
print(cv2.cuda.getCudaEnableDeviceCount())  # 1

Check OpenCV Status in Python

总结

  OpenCV 在 Linux 上由于采用源码编译的方式进行安装,加上 OpenCV 支持使用 CUDA 加速,因此安装过程非常繁琐,且容易出错。本文所介绍的安装方法已经过多台设备的多个系统的验证,并已投入到实际的开发、生产环境中。若各位还有其它关于 OpenCV(在Linux上)安装的技巧与知识,欢迎在下方评论区留言、分享。