近年来,人工智能是伴随着科技发展出现的一个重要词汇,全球多个国家提出了发展人工智能 的规划方案。我国也在大力发展人工智能,众多高校也纷纷成立了关于人工智能的学院与专业。而 在人工智能领域,数字图像处理与计算机视觉占据着重要的地位,人脸识别、刷脸支付、无人驾驶 等词汇都是数字图像处理与计算机视觉领域的重要成果。图像处理和计算机视觉技术与我们日常生 活的关系越来越密切,越来越多的人已投身到相关技术的学习与研究中,而在学习与应用过程中一 定会接触到 OpenCV。本节将介绍 OpenCV 与计算机视觉的联系以及 OpenCV 自身的发展过程。
提及计算机视觉(computer vision),就不得不提起图像处理(image processing)。二者虽然并 没有明确的差异,但是通常将图像处理理解为计算机视觉的预处理过程,因此在介绍计算机视觉之 前,本章先介绍图像处理。图像处理一般指数字图像处理(digital image processing),即通过数学 函数和图像变换等手段对二维数字图像进行分析,获得图像数据的潜在信息,而不对图像本身进行 任何的推理。它通常包括图像压缩, 增强和复原, 匹配、描述和识别,涵盖图像去除噪声、分割、 特征提取等处理方法。
计算机视觉是一门研究如何使机器“看”的科学,即用计算机来模拟人的视觉机理,用摄像头 代替人眼对目标进行识别、跟踪和测量等,通过处理视觉信息获得更深层次的信息。例如,通过拍 摄环绕建筑物一周的视频,利用三维重建技术重建建筑物三维模型;通过放置在车辆上方的摄像头 拍摄前方场景,推断车辆能否顺利通过前方区域等决策信息。对于人类来说,通过视觉获取环境信 息是一件非常容易的事情,因此有人会误认为实现计算机视觉是一件非常容易的事情。但事实不是 这样的,因为计算机视觉是一个逆问题,通过观测到的信息恢复被观测物体或环境的信息,在这个 过程中会缺失部分信息,造成信息不足,增加问题的复杂性。例如,当通过单个摄像头拍摄场景时, 因为失去了距离信息,所以常会出现图像中“人比楼房高”的现象。因此,计算机视觉领域的研究 还有很长的路要走。
无论是图像处理还是计算机视觉,都需要在计算机中处理数据,因此研究人员不得不面对一个 非常棘手的问题——将自己的研究成果通过代码输入计算机,进行仿真验证。而在这个过程中会重复编写基本的程序,这相当于为了制造一辆汽车,需要重新发明车 轮子。为了给所有研究人员提供“车轮”,英特尔(Intel)提出了开 源计算机视觉库(Open Source Computer Vision Library ,OpenCV) 的概念,通过在计算机视觉库中包含图像处理与计算机视觉的通用 算法,避免重复无用的工作。因此,OpenCV 应运而生。OpenCV 由一系列C 语言函数和C++类构成,除支持使用C/C++语言进行开 发之外,它还支持 C# 、Ruby 等编程语言,并提供了 Python 、 MATLAB 、Java 等应用程序编程接口。它可以在 Linux 、Windows 、 macOS 、Android 和 iOS 等系统上运行。OpenCV 的出现极大地方便 了计算机视觉研究人员的算法验证,得到了众多研究者的喜爱。经 过 20 年的发展,它已经成为计算机视觉领域最重要的研究工具之 一。图 1-1 是 OpenCV 的官方标识。
自从 2015 年 6 月OpenCV 3.0.0 版本发布,时隔 3 年半 OpenCV 4.0 版本发布,这标志着OpenCV 进入 4.x 版本。OpenCV 4.0 进一步完善了核心接口, 并添加了二维码检测器、ONNX 转换格式等 新功能。OpenCV 官方给出的新版本的重要更新如下。
• OpenCV 4.0 基于 C++ 11 标准,因此要求编译器兼容 C++ 11 标准,所需的CMake 至少是3.5.1 版本。
• 移除了OpenCV 1.x 版本中C 语言方面的大量 API 。
• core 模块中的 Persistence (用于存储和加载 XML 、YAML 或 JSON 格式的结构化数据) 可 以用C++来重新实现,因此在新版本中移除了C 语言的 API 。
• 新增了基于图的高效图像处理流程模块 G-API 。
• dnn 模块包括实验使用的 Vulkan 后端,且支持 ONNX 格式的网络。
• Kinect Fusion 算法已针对 CPU 和GPU 进行了优化。
• objdetect 模块中添加了二维码检测器和解码器。
• DIS dense optical flow 算法从 opencv_contrib 模块转移到 video 模块。
在撰写本书的过程中,OpenCV 4.1.2 版本已经推出, 为了保证读者了解最新的内容,我们将 继续介绍 OpenCV 4.1 版本和OpenCV 4.1.2 版本中重要的更新。
• 缩短了 core 和 imgproc 模块中部分较大函数的执行时间。
• videoio 模块中添加了 Android Media NDK API 。
• 在 opencv_contrib/stereo 模块中实现了密集立体匹配算法。
• 将原图像质量分析模块 quality 添加到 opencv_contrib/stereo 模块中。
• 增加了手眼标定模型。
• 对 dnn 模块进行了如下改进。
▶添加了 TensorFlow 中的多个网络。
▶初步支持 3D 卷积网络。
▶推理引擎后端支持异步推理。
▶实现了网络的可视化。
• 对 calib3d 模块进行了如下改进。
▶ 添加了用于求解 PnP 问题的新 IPPE 算法。
▶ 添加了姿势优化例程。
• 更新了与匹配与追踪相关的内容。
• 重新设计了日志子系统并且提高了其稳定性。 其中OpenCV 4.1.2 版本更新的内容如下。
• Google Summer of Code (GSoC)项目集成了新的内容。
▶对 OpenCV.js 中的线程和 SIMD 进行了优化。
▶添加了基于学习的超分辨率模块。
• 对 dnn 模块进行了如下改进。
▶ 增加了具有自动预处理和后处理功能的高级 API 。
▶ OpenVINO 2019R3 增加了推理引擎后端。
• 增加了对 MIPS 平台 SIMD 的支持。
• 对库中的 API 进行了优化,优化了 dotProd 、FAST Corners 、HOG 、Pyramid-LK 、norm 、 warpPerspective 等算法。
• 提高了Aruco 项目中白色标记的检测精度,并添加了独立的模型生成器。
• 提高了二维码检测的准确性。
综合以上几个版本的重要更新内容,你可以发现 OpenCV 4 的更新方向是去除一些过时的C 语 言的 API,增加更多图像处理与计算机视觉算法模型。更重要的是,OpenCV 逐步集成了深度学习 模型,便于使用者通过深度学习解决计算机视觉问题。因此,在人工智能的潮流下,研究计算机视 觉领域的研究人员非常有必要了解并学习 OpenCV 4 的用法。
OpenCV 4详解:基于Python
162个函数,286段代码清单,24种算法
本书基于 OpenCV 4.1.2 版本,讨论 OpenCV 4 的功能,以及 OpenCV 在图像处理和计算机视觉方面的应 用。本书共 12 章,主要内容包括 OpenCV 的基础知识,数据的载入、显示与保存,图像基本操作,直方图, 图像滤波,图像形态学操作,目标检测, 图像分析与修复,特征点检测与匹配,立体视觉,视频分析,机器 学习在 OpenCV 中的实现方式。
近年来,关于计算机视觉的研究如火如荼,它极大地方便了人们的生活,并且吸引了越来越多 的学生、老师以及研究人员的关注。OpenCV 作为计算机视觉领域中一个重要的工具库, 自然也受 到了更多的关注。OpenCV 自问世以来,一直以帮助研究人员和开发者提高研究开发的效率为目标, 逐渐成为研究计算机视觉的老师和学生的重要工具,也成为初学者在计算机视觉方面快速入门的重 要工具之一。
“磨刀不误砍柴工”,OpenCV 就是学习计算机视觉的过程中经常使用的工具,熟练掌握OpenCV 的使用方法会助力计算机视觉的学习,起到事半功倍的效果。OpenCV 降低了计算机视觉的学习门 槛,但是由于缺少系统的学习资料,尤其是官网上的学习文档与对应的版本之间存在着较大的滞后 性,因此最新版的OpenCV 发布后的很长一段时间内,初学者都无法学以致用。
随着机器学习、深度学习等领域的发展,Python 语言庞大的扩展库为Python 使用者在编程过 程中提供了极大的便利,OpenCV-Python 便是其中一员。在实际使用OpenCV-Python 扩展库的过程 中, 更多的读者关心库中函数的基本原理及如何更快地上手使用。我们之前参与撰写了《OpenCV 4 快速入门》,这本书基于 C++。经常有读者在作者的公众号中询问在Python 中使用 OpenCV 时遇 到的问题,于是这本基于Python 的 OpenCV 4 图书应运而生。本书以Python 语言为基础,添加了 部分新内容,可帮助使用Python 语言的开发人员快速入门 OpenCV 。
本书是入门级的 OpenCV 4 指南,适合具有一定计算机视觉基础和 Python 编程基础但刚接触 OpenCV 4 的读者阅读。本书从安装 OpenCV 4 的过程开始介绍,以计算机视觉知识脉络为主线, 由浅入深地介绍了OpenCV 4 在计算机视觉领域的应用以及相关函数的使用。为了让读者更好地理 解 OpenCV 4 中每个函数的原理和使用方式, 在介绍 OpenCV 4 中的函数之前, 本书首先会介绍相 关的图像处理知识。但是,我们不想将本书写得像一本图像处理算法图书,而希望把更多的精力放 在 OpenCV 4 的介绍上, 因此本书对相关知识只做了简要介绍。如果读者对算法感兴趣,那么可以 阅读相关的参考图书。
本书有 12 章,主要内容介绍如下。
第 1 章首先介绍 OpenCV 的发展过程、OpenCV 4 的新增功能, 以及 OpenCV-Python 的安装过 程、环境配置与安装过程中常见问题的解决方案, 然后讲述 OpenCV 4 的模块结构和部分源代码。
第 2 章首先介绍 NumPy 的相关基础知识与操作函数, 然后讲述 OpenCV 4 中图像文件、视频 文件、XML 文件的加载与保存。
第 3 章介绍图像颜色空间、像素基本操作、图像变换、图像金字塔以及窗口交互操作等。这些 操作是所有图像处理任务中基本的操作。
第 4 章不仅介绍图像直方图的绘制、相关操作以及直方图在实际任务中的应用,还讲述图像的 模板匹配及其应用。
第 5 章介绍图像卷积、图像噪声的生成、线性滤波、非线性滤波以及图像的边缘检测等。
第 6 章介绍对二值图像滤波的过程,主要有像素距离、连通域、腐蚀、膨胀、开运算、闭运算 等形态学应用。
第 7 章介绍如何在图像中进行形状检测、轮廓检测、矩的计算、点集拟合以及二维码的检测。 第 8 章介绍傅里叶变换、积分图像、图像分割与图像修复等。
第 9 章介绍角点的检测与绘制、多种特征点的检测与匹配。通过对本章的学习,读者将会掌握 如何利用OpenCV 4 在图像中提取任意一种特征点。
第 10 章介绍相机的成像原理,单目相机和双目相机的标定,以及图像的校正。相机模型是 计算机视觉中最重要的模型之一。该章的内容是连接图像信息与环境信息的重要纽带。
第 11 章介绍如何在视频中跟踪移动的物体,主要方法有差值法、均值迁移法以及光流法。
第 12 章首先介绍通过 OpenCV 4 如何实现传统机器学习中的 k 均值聚类算法、k 近邻算法、决 策树、支持向量机等,然后讨论在 OpenCV 4 中如何通过深度神经网络模型实现图像识别、风格迁 移等。
本书介绍了 OpenCV 4 中的大量函数并展示了大量示例程序。当然, 这并不是 OpenCV 4 的全 部内容, 只包括了 OpenCV 4 中常用的函数和功能。但是,当读者将本书介绍的内容熟练掌握后, 对未介绍的延伸内容也会很快掌握。
本书能够激发你对计算机视觉和 OpenCV 的热爱。