OpenCV 5 正式发布:计算机视觉多年来的最大飞跃

Hacker News Top 工具

摘要

OpenCV 5 是计算机视觉库的重大版本更新,包含全新的 DNN 引擎、改进的 ONNX 支持、硬件加速以及更简洁的架构。对于从事经典视觉、深度学习及边缘部署的开发者而言,这标志着一次重要的现代化升级。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/09 08:42

# OpenCV 5 来了:计算机视觉领域多年来最大的一次飞跃 来源:https://opencv.org/opencv-5/ OpenCV 5 GitHub (https://github.com/opencv/opencv/tree/5.x) Wiki (https://github.com/opencv/opencv/wiki/OpenCV-5) 文档 (https://docs.opencv.org/) OpenCV 5 是 OpenCV 历史上最重要的版本之一。二十多年来,OpenCV 一直是计算机视觉研究、机器人、嵌入式视觉、AI应用、工业检测、AR/VR、医学成像以及无数生产系统的基石。如今,该库在 GitHub 上拥有超过 86,000 颗星,每日安装量超过一百万次,并拥有全球最大规模的计算机视觉算法集合之一。OpenCV 5 在这一基础上进行了重大现代化改造。它带来了全新的 DNN 引擎、更强的 ONNX 支持、硬件加速改进、更好的 Python 集成、新的数据类型、扩展的 3D 视觉能力、改进的文档,以及更清晰的未来架构。这不仅仅是一次增量更新。OpenCV 5 是一次重大的飞跃。 ## 为何推出 OpenCV 5 自 OpenCV 4 以来,计算机视觉领域发生了翻天覆地的变化。现代应用将经典视觉、深度学习、Transformer、大型视觉模型、边缘部署、异构硬件以及 Python 优先的工作流程融为一体。开发者期望相同的代码能够在笔记本电脑、服务器、嵌入式设备、ARM 芯片、骁龙平台以及专用加速器上高效运行。OpenCV 5 正是为满足这一现实而设计的。 其目标十分明确:让核心更快、更小,改进语言支持,清理旧 API,现代化 DNN 引擎,支持新的硬件加速路径,改进 3D 视觉工具,并使文档更易用。如果你在过去几年里用 OpenCV 发布过任何产品,你一定能体会那种感觉:这个库几乎无所不能,但深度学习方面总是比人们实际使用的模型慢一步。你导出一个新模型为 ONNX,然后指向 OpenCV 的 DNN 模块,只能祈祷它能跑起来。有时能行,有时则报错某个从未听说过的算子。 在这篇文章中,我们将逐一介绍新特性、它们在实际中的意义,以及对你编写的代码会产生什么影响。你不需要了解库的内部原理。只要你曾经写过 `cv2.imread`,那么这篇文章就适合你。 **OpenCV5 的 pip 版本将于 6 月 8 日发布。** ## 目录 - 为何推出 OpenCV 5 (https://opencv.org/opencv-5/#h-why-opencv-5) - OpenCV 的现状 (https://opencv.org/opencv-5/#h-where-opencv-stands-today) - OpenCV 5 要解决哪些问题 (https://opencv.org/opencv-5/#h-what-opencv-5-set-out-to-fix) - 重磅:全新的 DNN 引擎 (https://opencv.org/opencv-5/#h-the-headline-a-brand-new-dnn-engine) - 三个引擎,统一 API (https://opencv.org/opencv-5/#h-three-engines-one-api) - 速度对比:OpenCV 5 vs ONNX Runtime (https://opencv.org/opencv-5/#h-how-fast-is-it-opencv-5-vs-onnx-runtime) - 开箱即用的模型 (https://opencv.org/opencv-5/#h-models-that-run-out-of-the-box) - 在 OpenCV 内部运行 LLM 和 VLM (https://opencv.org/opencv-5/#h-llms-and-vlms-running-inside-opencv) - 使用 LaMa 进行图像修复和扩散 (https://opencv.org/opencv-5/#h-inpainting-and-diffusion-with-lama) - 现代特征匹配:深度学习方式 (https://opencv.org/opencv-5/#h-modern-feature-matching-the-deep-learning-way) - 更快、更轻、更现代的核心 (https://opencv.org/opencv-5/#h-a-faster-leaner-more-modern-core) - 您无需付费即可获得的硬件加速 (https://opencv.org/opencv-5/#h-hardware-acceleration-you-get-for-free) - 更好的 3D 视觉 (https://opencv.org/opencv-5/#h-better-3d-vision) - 不再令人头疼的文档 (https://opencv.org/opencv-5/#h-documentation-that-doesn-t-fight-you) - OpenCV 5.0 随附的内容 (https://opencv.org/opencv-5/#h-what-opencv-5-0-ships-with) - 下一步:DNN 引擎中的 GPU 和非 CPU HAL (https://opencv.org/opencv-5/#h-what-s-next-gpu-in-the-dnn-engine-and-a-non-cpu-hal) - 新 DNN 引擎的原生 GPU 支持 (https://opencv.org/opencv-5/#h-native-gpu-support-in-the-new-dnn-engine) - 用于加速预处理和后处理的非 CPU HAL (https://opencv.org/opencv-5/#h-a-non-cpu-hal-for-accelerated-pre-and-post-processing) - 尝试并参与贡献 (https://opencv.org/opencv-5/#h-try-it-and-get-involved) - 结论 (https://opencv.org/opencv-5/#h-conclusion) ## OpenCV 的现状 在深入了解变化之前,有必要回顾一下 OpenCV 的使用广泛程度。这不是一个小众研究工具,而是计算机视觉世界很大一部分的管道基础。 *(来源:github.com/opencv/opencv, pypistats.org, embedded-vision.com。)* 当一个库如此深入地嵌入到生产系统中时,每一个改变都必须谨慎进行。这也是为什么一次重大版本需要时间,以及为什么它最终到来时是一件大事。此外,了解它的构建者也很重要。OpenCV 由非营利组织 **OpenCV.org** 管理,开发和维护来自 **Big Vision** (https://bigvision.ai/consulting)(支持该库、OpenCV University 和本博客等内容)、**OpenCV China** (https://www.opencv.org.cn/)(RISC-V 和嵌入式工作的重要力量)以及 **OpenCV.ai** (http://opencv.ai/)。 ## OpenCV 5 要解决哪些问题 团队开始开发 OpenCV 5 时,列出了一份明确的痛点清单。如果你使用 OpenCV 已有一段时间,你一定会认识其中大部分: - **更好的语言支持:** 现代化的 Python、更新的绑定、命名参数,不再需要猜测参数顺序。 - **更快、更小的核心:** 更紧凑的代码、弃用遗留的 C API、更精简的构建。 - **更清晰的硬件加速层**,使厂商能够插入优化内核,而无需纠结于一堆 `#ifdef`。 - **更清晰的 API:** 正确的 0D/1D 张量、原生 FP16/BF16、真正的日志功能。 - **下一代 DNN 引擎:** 基于图、支持融合、广泛的 ONNX 支持、Transformer、VLM/LLM。 - **更好的 3D 视觉:** ChArUco、多相机标定和可视化。 - **更好的文档:** 现代化、可导航、阅读体验更佳。 本文的后续内容就是这一清单的具体实现。我们将从影响最广泛的变化开始。 ## 重磅:全新的 DNN 引擎 此版本中最重要的一个数字是覆盖率。OpenCV 的 ONNX 算子支持从 4.x 时代的大约 **22%** 跃升至 OpenCV 5 中的 **超过 80%**。如果你曾经因为 OpenCV 拒绝加载现代模型而烦恼,那么这个数字就是解决方案。 这个数字背后的原因比数字本身更有趣。老旧的 4.x 引擎只导入了 ONNX 算子集的一小部分,并且难以处理动态形状——而这正是大多数现代模型的特点。5.x 引擎围绕**类型化操作图**进行了重建,具备正确的形状推断、常量折叠和算子融合。它不再将网络视为一维层列表并逐个遍历,而是将模型理解为一张图。这使得它能够对网络进行推理、简化,并实现更高的运行效率。 *ONNX 算子覆盖率,过去与现在。* 新引擎能够处理而旧引擎无法处理的几件事: - **If** 和 **Loop** 子图:包含控制流的模型现在可以加载和运行。 - **符号形状和动态形状:** 不再需要脆弱的“形状必须预先知道”。 - **量化/反量化(QDQ)图:** 用于运行量化模型。 - **Attention 和 MatMul 融合:** Transformer 的构建块,合并为高效的融合操作。 最后一点值得深入探讨。其中一个关键的优化是**注意力融合**。引擎能够识别出每个 Transformer 核心的经典 MatMul → Softmax → MatMul 模式,并将其合并为一个融合的注意力操作,背后基于 FlashAttention 风格的实现。你无需额外操作。加载模型,它就会跑得更快。 | 方面 | 经典引擎 (4.x) | 新引擎 (5.x) | |---|---|---| | 模型表示 | 每层一个结构体,按顺序遍历 | 引擎可分析的类型化图 | | 形状 | 仅静态 | 符号、动态 | | 子图 | 不支持 | 支持 If 和 Loop | | 融合 | 有限 | QDQ、BatchNorm、Attention、MatMul、Softmax 等 | | 内存 | 逐层复用 | 统一缓冲区池,积极复用内存 | 实际结果是显而易见的:更多模型可以加载,更多模型可以正确运行,而且许多模型运行得更快。 ## 三个引擎,统一 API 重构总会让人感到不安,这是有道理的。没有人希望一个正常运行的流水线在升级日崩溃。OpenCV 5 通过在同一个 DNN API 背后保留多个引擎来解决这个问题。你可以在读取模型的地方选择使用哪个引擎,通过 `readNet*` 系列函数的一个 `engine` 参数来指定。这些值来自 `cv::dnn::EngineType` 枚举: | 值 | 含义 | |---|---| | ENGINE_CLASSIC (1) | 强制使用旧版 4.x 风格引擎。这是支持非 CPU 后端和 CUDA、OpenVINO 等目标的路径。 | | ENGINE_NEW (2) | 强制使用新的图引擎,支持融合和动态形状。目前仅在 CPU 上运行。 | | ENGINE_AUTO (3) | 默认值。首先尝试新引擎,如果模型加载失败则回退到经典引擎。 | | ENGINE_ORT (4) | 使用捆绑的 ONNX Runtime 包装器。仅支持 ONNX 模型,且构建时必须配置 `WITH_ONNXRUNTIME=ON`。 | 由于 `ENGINE_AUTO` 是默认值,大多数代码不需要做任何特殊处理。你读取模型,OpenCV 会在可能时使用新引擎,否则使用旧引擎。当你想要固定使用某个特定引擎时,可以在加载时传入参数。 Python 代码: ```python import cv2 as cv # 默认行为 (ENGINE_AUTO):优先新引擎,经典引擎作为后备 net = cv.dnn.readNetFromONNX("model.onnx") # 或者显式固定新图引擎 # net = cv.dnn.readNetFromONNX("model.onnx", engine=cv.dnn.ENGINE_NEW) net.setInput(blob) out = net.forward() ``` C++ 代码: ```cpp #include <opencv2/dnn.hpp> using namespace cv; // 默认行为 (ENGINE_AUTO) dnn::Net net = dnn::readNetFromONNX("model.onnx"); // 或者在加载时固定特定引擎 // dnn::Net netNew = dnn::readNetFromONNX("model.onnx", dnn::ENGINE_NEW); net.setInput(blob); Mat out = net.forward(); ``` 有一点需要了解:新引擎目前仅支持 CPU,因此如果你选择非 CPU 后端和目标(例如通过 `setPreferableBackend` 和 `setPreferableTarget` 选择 CUDA 或 OpenVINO),则应该使用经典引擎。OpenCV 示例程序会在你通过命令行传入非默认后端或目标时自动切换到 `ENGINE_CLASSIC`。 这种设计将升级日的风险降到最低。旧引擎仍然存在,用于处理新引擎尚无法加载或无法加速的任何内容,而可选的 ONNX Runtime 路径(如果构建时启用)进一步扩大了覆盖范围,所有这些都通过相同的 `Net` API 完成。 ## 速度对比:OpenCV 5 vs ONNX Runtime 覆盖率是一方面,而速度才是人们争论的焦点。团队在 CPU 上对多种真实模型进行了新引擎与 ONNX Runtime 的直接对比。以下是 OpenCV 5 胜出的情况: | 模型 | OpenCV 5 DNN (ms) | ONNX Runtime (ms) | 差异 | |---|---|---|---| | XFeat | 6.56 | 8.61 | **快 31.25%** | | YOLOv8n | 10.9 | 12.15 | **快 11.5%** | | YOLOX-S | 23.46 | 25.16 | **快 7.24%** | | DINOv2 small | 23.78 | 29.58 | **快 24.4%** | | RF-DETR | 102.01 | 106.49 | **快 4.4%** | | OWLv2 | 1,090 | 1,489 | **快 36.6%** | | BiRefNet | 7,178 | 9,503.14 | **快 32.4%** | *硬件:Intel Core i9-14900KS,Ubuntu 24.04 LTS。延迟越低越好。差异表示在相同模型和机器上 OpenCV 5 DNN 相比 ONNX Runtime 快多少。* 这种模式普遍存在。从像 YOLO26n 这样的小型实时检测器到像 OWLv2 这样的大型开放词汇模型,OpenCV 5 的原生引擎与成熟且高度优化的运行时相比具有竞争力,并且通常更快,同时将所有内容保持在一个依赖项中。完整的基准测试结果可在 [OpenCV5 DNN 基准测试](https://github.com/opencv/opencv/wiki/OpenCV-5-DNN-Benchmarks) 中找到。 *完全通过新 DNN 引擎实现的实时 RF-DETR 检测。* ## 开箱即用的模型 更好的 ONNX 覆盖率在你看完它所支持的模型列表后就会变得具体起来。OpenCV 5 已经验证了涵盖检测、分割、骨干网络和生成模型的广泛现代阵容: 如果您的项目依赖其中任何一个,OpenCV 5 意味着您的依赖列表中将减少一个框架。 ## 在 OpenCV 内部运行 LLM 和 VLM 这一点仍然让许多人感到惊讶。OpenCV 5 可以直接在 **DNN 模块内部运行大型语言模型和视觉-语言模型**,无需单独的运行时。为了实现这一点,OpenCV 5 提供了两个经典 CV 库从未需要的东西: - **原生分词器**,内置在库中; - **KV-cache** 用于自回归解码,使模型逐个 token 生成时保持高效。 这些功能适用于 Qwen 2.5、Gemma 3、PaliGemma 以及 GPT-2/GPT-4 系列,全部通过你已经用于 YOLO 模型的相同 `Net` API。视觉-语言流水线(图像输入,文本输出)通过像 PaliGemma 这样的模型得到支持。 在团队的测试中,通过 OpenCV 引擎询问 Qwen 2.5 “What is OpenCV?” 产生的输出与 ONNX Runtime **逐 token 匹配**。这是一个令人安心的信号,表明为了将所有内容保持在一个库中的便利性,并没有牺牲正确性。 OpenCV 会取代用于生产聊天机器人的专用 LLM 服务栈吗?不会,它也没有这个目标。它为你提供的是:一个视觉流水线,能够为字幕生成、OCR 后处理或开放词汇查询等任务调用小型语言或视觉-语言模型,而无需额外引入一个单独的框架。 ## 使用 LaMa 进行图像修复和扩散 该版本中最令人满意的演示之一是**使用 LaMa 进行对象移除**,完全在新 DNN 引擎内运行。你提供一张图像和一个要移除区域的掩码,它会用混合边缘填充空洞,无需外部运行时。 *输入掩码,输出干净的图像。一次前向传播完成 LaMa 修复。* 流程非常简单: 1. **输入图像:** 包含要移除物体的照片。 2. **掩码:** 要移除的区域,可以由用户绘制,也可以由检测器生成。 3. **一次前向传播:** 通过 OpenCV DNN 引擎的单次 `Net::forward`。 4. **干净的输出:** 空洞被填充,边缘被混合。 代码确实就这么短: ```python import cv2 as cv net = cv.dnn.readNetFromONNX("lama.onnx") blob = cv.dnn.blobFromImages([img, mask], scalefactor=1/255.) net.setInput(blob) out = net.forward() # 修复后的图像 ``` 一个可运行的版本位于 OpenCV 5.x 分支的 `samples/dnn/inpainting.py`,如果你想要更进一步,还有一个基于扩散的修复示例(`samples/dnn/ldm_inpainting.py`)。 ## 现代特征匹配:深度学习方式 特征检测与匹配是 OpenCV 最古老的任务之一。它为全景拼接、图像对齐以及大量 3D 重建提供动力。多年来,这意味着 SIFT 和 ORB。OpenCV 5 将现代学习方法作为一等公民引入库中。 新的 **Features** 模块取代了 Features2D,增加了完整的神经检测、描述和匹配流水线: - **cv::ALIKED:** 一个基于 CNN 的关键点检测器和描述符,可以直接插入你之前使用 SIFT 或 ORB 的相同调用位置。 - **cv::DISK:** 通过强化学习训练的学习特征,在宽基线和对低纹理场景表现强劲。 - **cv::LightGlueMatcher:** 一个基于注意力的匹配器,产生置信度评分的匹配,并可插入拼接模块。 经典的检测器(SIFT、ORB、FAST、GFTT、MSER)仍然保留,而更小众的检测器已移至 opencv_contrib。因此,你可以从...

相似文章

opencv/opencv

GitHub Trending (daily)

OpenCV是一个开源计算机视觉库,提供图像处理、机器学习和人工智能开发的工具。

OpenAI Five 基准测试:结果

OpenAI Blog

OpenAI 发布了其 Dota 2 游戏系统 OpenAI Five 的基准测试结果,详细介绍了六个主要版本的训练方法,计算需求从 8 到 35 petaflop/s-days 不等,并推出了新的网络架构工具。

Claude Opus 4.7 正式发布

Anthropic News

Anthropic 发布了 Claude Opus 4.7,这是一款全新的 AI 模型,在高级软件工程、视觉能力和自我验证方面实现了显著提升。该版本包含专门的安全防护措施,现已通过 API 及主要云服务商提供。

介绍 GPT-5

OpenAI Blog

OpenAI 推出 GPT-5,这是 AI 智能的重大飞跃,在代码编写、数学、写作、健康和视觉感知等方面展现了最先进的性能。这个统一系统包括一个高效的智能模型、一个深度推理模型(GPT-5 thinking)和一个实时路由器,用于最优响应选择。