在 Ubuntu 中安装 OpenCV

2025年3月17日 | 阅读 12 分钟

什么是 OpenCV?

OpenCV(代表 **开源计算机视觉库**)是一个主要专注于实时计算机视觉的编程功能库。它最初由英特尔集成,后来由 Willow Garage 继而由 **Itseez**(后被 **英特尔** 收购)提供。**OpenCV** 是 **免费** 且 **跨平台** 的,可在 **开源 Apache 2 许可证** 下使用。自 2011 年起,它开始支持 GPU 加速以实现实时应用。

什么是计算机视觉?

计算机视觉可以被描述为一个过程,从中我们可以了解视频和图像的概念,了解它们如何存储,以及如何从中检索和操作信息。计算机视觉是 **人工智能** 的基础或主要应用领域。它在 **机器人、自动驾驶汽车** 和 **照片编辑应用** 等领域发挥着重要作用。

计算机视觉是一个学科,它描述了如何使用 2D 图像来理解、解释和重建 3D 视图,并考虑了视图中可用的结构属性。它致力于通过计算机硬件和软件来复制和模拟人类视觉。

计算机视觉可以与以下领域显著重叠

  • 模式识别: 模式识别描述了各种分类模式的方法。
  • 图像处理: 图像处理侧重于图像操作。
  • 摄影测量: 摄影测量涉及从图像中获取精确测量。

OpenCV 的功能

以下是一些 OpenCV 的重要功能

  • CUDA 加速
  • 聚类和机器学习 (flann, ml)
  • 计算摄影 (video, photo, superres)
  • 立体计算机视觉或基于几何的单目 (videostab, stitching, calib3D)
  • 特征/对象检测 (nonfree, features2d, objdetect)
  • 视频/图像 I/O、显示、处理 (highgui, core, imgproc)

什么是图像处理?

它是一种对任何图像执行一些操作的方法,以获得增强的图像,或从中提取一些有用信息。图像处理的基本定义可以是“图像处理是对数字图像进行操作和分析,以提高其质量”。

数字图像

图像可以被归类为 **二维函数 f(x,y)**,其中 **x** 和 **y** 是平面(空间)坐标,任何坐标对的幅度称为该图像在该特定点的 **灰度** 或 **亮度** 级别。

图像本质上是 **二维矩阵**,它由一个 **数学函数 f(x,y)** 在任何特定点定义,该函数提供了该点图像像素的值。该像素的值指定了该特定像素的亮度以及它将具有的颜色。

基本上,图像处理是信号处理,其中输入称为 **图像**,输出称为 **特征** 或 **图像**,具体取决于与该图像相关的需求。

图像处理有以下三个步骤

  • 图像的操作和分析
  • 导入图像
  • 输出,结果可以是修改后的报告或基于图像分析的图像

OpenCV 的历史

1999 年,**OpenCV** 正式发布,这是 **英特尔研究院** 的一项计划,旨在推进 CPU 密集型应用的开发,这是 3D 显示墙和实时光线追踪等项目的一部分。该项目的首要贡献者包括 **高性能库团队** 和 **英特尔俄罗斯** 的多位优化专家。在 **OpenCV** 的早期,项目目标被定义为

  1. 通过提供所有开发人员都可以在其上构建的基础设施来传播视觉知识,从而使代码更易于转移和阅读。
  2. 通过提供不仅开源而且经过优化的常用视觉基础设施代码来推进高级视觉研究。
  3. 通过提供免费、性能优化且可移植的代码,并采用一项不需要代码必须开源的许可证,来推进基于视觉的技术应用。

2000 年,第一个 **OpenCV alpha 版本** 在 **IEEE 计算机视觉与模式识别会议** 上向公众发布,并在 2001-2005 年间发布了 5 个 beta 版本。2006 年,发布了初始的 1.0 版本。1.1 版本 **“预发布版”** 于 2008 年 10 月发布。2009 年 10 月,发布了第二个主要的 OpenCV 版本。

**OpenCV 2** 在 **C++** 接口方面进行了重大修改,侧重于更好的实现、新功能、更安全的代码模式,以及比性能(尤其是在多核系统上)更容易使用。现在,官方版本每 6 个月发布一次,改进由得到技术公司支持的俄罗斯团队实施。

2012 年 8 月,OpenCV 的支持由一个名为 **OpenCV.org** 的非营利性基金会接管。该基金会管理着一个用户和开发者网站。

2016 年 5 月,**英特尔** 签署协议收购了领先的 OpenCV 开发商 **Itseez**。

OpenCV 宣布并启动了 **OpenCV AI Kit** 的 **Kickstarter 活动**,这是一系列硬件模块,旨在为 OpenCV 添加支持 AI 的功能。

OpenCV 的应用

OpenCV 的应用领域包括

Install OpenCV in Ubuntu
  • 增强现实
  • 运动追踪
  • 从运动中重建结构(SFM)
  • 立体视觉
  • 识别和分割
  • 对象检测
  • 运动理解
  • 移动机器人
  • 人机交互(HCI)
  • 手势识别
  • 面部识别系统
  • 自身运动估计
  • 3D 和 2D 特征工具包

为了支持以上部分领域,OpenCV 包含一个用于机器学习的统计库,其中包括

  • 深度神经网络(DNN)
  • 支持向量机(SVM)
  • 随机森林
  • 人工神经网络
  • 朴素贝叶斯分类器
  • k-最近邻算法
  • 期望最大化算法
  • 梯度提升树
  • 决策树学习
  • Boosting

OpenCV 的编程语言

**OpenCV** 用 **C++** 语言编写,其主要接口是 C++,但它仍然有一个不那么广泛但广泛存在的旧 C 接口。所有新的算法和开发都发生在 C++ 接口中。存在 **MATLAB/OCTAVE、Java** 和 **Python** 的多种绑定。接口的 API 可以在在线文档中找到。

为了鼓励更广泛的受众采用,已经开发了许多不同编程语言的包装器。在 3.4 版本中,发布了特定 OpenCV 功能子集的 JavaScript 绑定,称为 **OpenCV.js**,用于 Web 平台。

OpenCV 的操作系统支持

**OpenCV** 在许多桌面操作系统上运行。其中一些如下

  • Windows
  • OpenBSD
  • NetBSD
  • FreeBSD
  • macOS
  • Linux

**OpenCV** 也在以下几种移动操作系统上运行

  • BlackBerry 10
  • Maemo
  • iOS
  • Android

用户可以从 **SourceForge** 获取官方版本,或使用 **GitHub** 获取最新源代码。此外,OpenCV 应用 **CMake** 的概念。

硬件加速

当库检测到计算机上安装了英特尔的集成性能原语时,它将使用这个专有例程来加速自身。

  • 自 2012 年 10 月以来,**基于 OpenCL 的 GPU** 接口一直在开发中,可以在 docs.opencv.org 网站上找到 **2.4.13.3** 版本的文档。
  • 自 2010 年 9 月以来,**基于 CUDA 的 GPU** 接口一直在开发中。

OpenCV 的平台

OpenCV 被开发为跨平台。因此,该库是用 C 语言编写的,这使得 OpenCV 几乎可以适应任何计算系统,从 PowerPC Mac 到各种机器人。自 2.0 版本以来,OpenCV 包含了其过渡性的 C 接口和新的 C++ 接口。对于几乎所有部分,OpenCV 的新算法现在都用 C++ 编写。

还设计了包括 Java 和 Python 在内的语言的包装器,以鼓励更广泛的受众采用。OpenCV 在移动设备(iOS、Maemo、Android)和桌面设备(OpenBSD、FreeBSD、MacOS、Android、Linux、Windows)上运行。

  • Android:自 2010 年以来,OpenCV 已移植到 Android 环境。它允许在移动应用程序开发中使用完整的库功能。
  • ARM:几乎所有嵌入式设备目前都使用基于 ARM 架构的 CPU,例如 Cortex-M 和 Cortex-A 系列。通常,深度学习算法在具有强大 NVIDIA GPU 的 x86/x64 服务器上进行训练。然后,需要将接口实现到低功耗 ARM 芯片上。
  • CUDA:一个提供 GPU 加速的新模块于 2010 年被添加到 OpenCV 中。该模块,即“gpu”,涵盖了库的重要部分,并且仍在开发中。它使用 CUDA 实现,因此受益于 CUDA 生态系统,例如 NVIDIA 性能原语(NPP)等库。通过包含 CUDA OpenCV 加速,开发人员可以在消耗更少电量的情况下,在实时图像上处理更复杂、更精确的 OpenCV 算法。
  • iOS:OpenCV 开发团队在 2012 年积极致力于添加持续的 iOS 支持。自 2.4.2 (2012) 版本起,已实现完全集成。
  • OpenCL:一个提供 OpenCV 算法 OpenCL 加速的新模块于 2011 年被添加到库中。它使得基于 OpenCL 的代码能够利用异构硬件,发挥集成和独立 GPU 的潜力。自 2.4.6 (2013) 版本起,官方 OpenCV winMegaPack 就包含了 ocl 模块。

OpenCV 的许可证

OpenCV 的许可证取决于库版本,分为两种不同的许可证。

OpenCV 4.5.0 及更高版本:OpenCV 4.5.0 及更高版本基于 Apache 2 许可证。

OpenCV 4.4.0 及更低版本:OpenCV 4.4.0 及更低版本,如 OpenCV 1.x、OpenCV 2.x 和 OpenCV 3.x,基于 3-clause BSD 许可证。

OpenCV 的发布

  • 版本 4.8.0
    • 支持 TFLite 模型,例如 int8 量化模型。
    • 启用了 DNN 模块的构建,无需 Protobuf 依赖。
    • FaceDetectorYN,用于更好的面部标志、准确性和性能支持。
    • 新的 ArUco 基于 QR 码的检测算法。
    • 条形码解码器和检测器已从 Contrib 迁移到主存储库。
  • 版本 4.7.0
    • 添加了对 CANN 的后端支持。
    • 加速卷积,尤其是针对 ARM CPU。
    • Winograd 卷积优化。
    • 基于神经网络的 Nanotrack v2 跟踪器。
    • 支持 FFmpeg 5.x。
    • 支持 NVIDIA 平台上的视频编解码器(硬件加速),并支持最新的视频编解码器 SDK(NVENCODEAPI 和 NVCUVID)。
  • 版本 4.6.0
    • 支持 Clang 15 和 GCC 12。
    • 支持 FFmpeg 5.0。
    • 禁用浮点非规格化数处理。
    • 在 ONNX 导入器中,修改了图层名称以正确支持“output”实体。
    • 添加了对 TIM-VX NPU 的后端支持。
    • 添加了对音频语音识别示例(C++)的支持。
  • 版本 4.5.5
    • 更新了 SOVERSION 的处理规则。
    • 添加了测试以管理多个 ONNX 合规性测试套件。
    • RISC-V 平台的更多优化。
    • 将 protobuf(内置)从 3.5.2-3.19.1 升级。
    • 修复了 OpenVINO 2021.4 版本的一些分析问题。
    • 修复了 OpenVINO 更新后出现的大量编译警告。
  • 版本 4.5.4
    • DNN 模块支持 8 位量化。
    • 升级了 OpenCV 绑定。
    • 支持语音识别。
    • OpenCV DNN 优化。
    • 添加了对 SoftNMS 实现的支持。
  • 版本 4.5.3
    • 支持 CUDA 后端的 MatMul。
    • 已修复批量重装问题。
    • 支持 OpenVINO 2021.4 LTS 版本。
    • 活动 OpenCL 内核缓存。
    • 改进了 Python 绑定,并为 G-API 配置提供了更多选项。
  • 版本 4.5.2
    • 导入 TensorFlow 解析错误调试。
    • 升级了 DetectionOutput 和 NMS 处理。
    • 修复了与常数一起使用的 Reshape、MatMul 和 Div。
    • 支持 Exp、SAM、TanH、LeakyReLU、NormalizeL2 和 Mish ONNX 子图。
    • 支持 OpenVINO 2021.3 版本。
  • 版本 4.5.1
    • 1D 池化和 1D 卷积优化。
    • 已修复 ReduceMean、Resize、Gather(两个或多个结果)和 Faster RCNN ONNX 模型。
    • 支持 INT32 ONNX 张量。
    • 支持 OpenVINO 2021.4 版本。
    • 预览支持 HDDL。
  • 版本 4.5.0
    • 支持 OpenVINO 2021.1 版本。
    • DNN CUDA 后端的优化和文件。
    • 支持基本的 G-API Python 绑定,但流式处理和推理支持仍在进行中。
    • 已解决序列化 API。
    • OpenVINO NN 的后端支持已迁移到 OpenVINO“Core”API。
    • 现在使用动态数量的 I/O 来表示图变得很方便。
    • 支持多个 OpenCL 上下文。
  • 版本 4.4.0
    • Scale-Invariant Feature Transfer(软特征转移)算法已迁移到主存储库。
    • 支持 Resnet_backbone。
    • 支持 EfficientDet 模型。
    • 添加了文本识别样本。
    • 支持 OpenVINO 2020.3 LTS/2020.4 版本。
    • 支持 NN Builder API,该 API 计划在下一个版本中删除。
  • 版本 4.3.0
    • 支持 ONNX,包括 Slice(两个或更多输入)、常量的代数、广播和 LSTM。
    • 支持 DarkNet,包括 scale_channels、swish、sigmoid 和 grouped convolution。
    • 支持 MobileNet-SSD 版本 3。
    • 通过 nGraph OpenVINO API 支持自定义层。
    • 在默认库中支持更多操作,例如 NV12toGray、WarpPerspective 和 WarpAffine。
  • 版本 4.2.0
    • 改进了使用 CUDA 后端的 GSoC 项目。
    • 支持 nGraph OpenVINO API(实验性/预览版)。
    • 添加了图内推理。
    • 增加了执行模型并支持流式处理。
    • 支持多线程
    • 支持 SIMD 指令集
  • 版本 4.1.2
    • 支持 2019R3。
    • 支持最新的 IE Core API。
    • 用于管理自定义层的机制。
    • 支持高级功能,包括 dnn:model 类或特定任务类组,例如 dnn:Segmentation model、dnn:DetectionModel 和 dnn: ClassificationModel。它还支持深度学习网络的自动后处理和预处理。
    • MSA SIMD 实现已共享用于 MIPS 平台。
    • 优化了 OpenCV.js。
  • 版本 4.1.1
    • 对 3D 卷积网络提供初步支持。已实现 Eltwise、Pooling、BatchNorm 和 Convolution 层。
    • 现在,2018R5 版本是最低支持版本。
    • 支持异步推理。
    • 使用 dot 文件可视化深度学习网络图。
    • 对 TensorFlow 和 ONNX 导入器进行了多项改进。
  • 版本 4.1.0
    • 某些模型的峰值内存消耗降低了高达 30%。
    • 改进并更新了与 Intel Inference Engine 的集成。
    • 现在,Inference Engine 2018R3 是最早支持的版本。
    • 现在支持并认证了 Myriad X。
    • 添加了对 IE IR 格式中自动网络重塑的支持。
    • 支持新网络,如 SSD、Faster-RCNN 和 Mask-RCNN,以及来自 TensorFlow Object Detection API 的 FPN SSD 和扩张卷积。
  • 版本 4.0.0
    • 从 OpenCV 1.x 中删除了多个 API。受影响的模块包括 calib3d、imgcodecs、videoio、video、photo 和 objdetect。
    • 持久化(从/向 JSON、YAML 或 XML 加载和存储结构化数据)已在 C++ 语言中完全重新实现,并且核心模块中也缺少 C API。
    • 现在,OpenCV 是一个 C++11 库,需要一个 C++11 兼容的编译器。另外,请记住 OpenCV 3.x 也可以被编译为 C++11 库。
    • 支持 Mask-RCNN 模型。
    • 实现了 ONNX 解析器。
    • 通过使用 DLDT 的更多层,在与 Intel DLDT 支持一起构建时,进一步提高了 DNN 模块的性能。
    • 支持几乎所有著名深度学习网络的快捷方式。
  • 版本 3.4.2
    • 为深度学习网络中的半精度浮点运算添加了 DNN_TARGET_OPENCL_FP16 计算目标,使用 OpenCL。
    • 添加了对 Intel Inference Engine 后端支持,以便在 VPU 和 GPU 设备上激活模型。
    • 启用了从 Intel 的 IR(中间表示)导入 OpenVINO 预训练网络。
    • 引入了对自定义层的支持,允许我们指定未实现的层或撤销现有层。
    • 引入了一个受 An Efficient and Accurate Scene Text Detector(EAST)启发的新的深度学习示例。
  • 版本 3.4.1
    • 支持量化 TensorFlow 网络。
    • 现在,OpenCV 可以利用 Intel DL 推理引擎作为 DNN 加速的后端。
    • 对性能关键内核(包括全连接层和卷积层)添加了 AVX-512 加速。
    • 可以通过一个 Python 脚本调用轻松导入在 TensorFlow Object Detection API 中重新训练和训练的基于 SSD 的模型,从而生成文本图表示。
    • 在多个核心机器上,cv::parallel_for_() 的 pthreads 后端性能得到了很大改进。
  • 版本 3.4
    • 添加了对 faster R-CNN 及其相关示例的支持。
    • 已继续支持 JavaScript 绑定,以促进 DNN 模块的使用。
    • DNN 已进一步增强,通过 OpenCL 支持 iGPU。
    • 磁盘上预编译的 OpenCL 内核缓存已最终实现。
    • 现在也可以通过 T-API 下载和执行预编译的 OpenCL 内核。
  • 版本 3.3.1
    • 添加了轻量级 Resnet-10、面部检测样本和基于 SSD 的网络。
    • 实现了有限的 Darknet 解析器,足以解析多个 YOLO 模型,以及添加一些 YOLO 对象检测网络变体的各种层。
    • 支持 FP16 网络。
    • 新添加了许多层以支持图像颜色化、文本检测和其他网络。
    • OpenCV 已针对 PPC64 架构进行了升级。
    • 生物启发模块的 OpenCL 加速路径已得到改进。
    • 通过 MediaSDK 进行硬件加速的视频解码/编码现在也支持 Windows。

在 Ubuntu 中安装 OpenCV

正如我们在上面解释的,**OpenCV** 是一个计算机视觉库,代表 **Open-Source Computer Vision Library。在这个缩写中,**open** 表示 **开源库**,并带有 Java、C++ 和 Python 的绑定,并支持 Linux 和 Windows 等不同的操作系统。

它可以使用 GPU 加速和多核处理来实现实时操作。OpenCV 库可用于多种应用,包括医学图像分析、3D 模型提取、面部检测和识别、监控视频、运动跟踪等。

本文将介绍如何在 Ubuntu 20.04 版本中安装 OpenCV。

使用 Ubuntu 仓库安装 OpenCV

在 Ubuntu 20.04 版本中,**OpenCV** 库可以在官方 Ubuntu 仓库中找到。首先,我们需要通过在终端窗口中输入以下命令来更新我们的 **apt 缓存**


Install OpenCV in Ubuntu

然后,我们将通过在终端窗口中执行以下命令来安装 OpenCV


Install OpenCV in Ubuntu

此命令将帮助我们在系统中安装所有必需的包。

完成 OpenCV 安装过程后,我们还可以通过导入模块 **cv2** 并运行以下命令来打印已安装的 OpenCV 版本来验证安装过程。在终端窗口中