《计算机视觉算法:基于OpenCV的计算机应用开发》

举报
华章计算机 发表于 2020/02/15 12:24:39 2020/02/15
【摘要】 本节书摘来自华章计算机《计算机视觉算法:基于OpenCV的计算机应用开发》 一作者是[伊朗] 阿明·艾哈迈迪·塔兹赫孔迪(Amin Ahmadi Tazehkandi) ,陈靖 杨欣 译。

智能科学与技术丛书

计算机视觉算法:基于OpenCV的计算机应用开发

Hands-On Algorithms for Computer Vision

1581740516173051.jpg

[伊朗] 阿明·艾哈迈迪·塔兹赫孔迪

(Amin Ahmadi Tazehkandi)  著

陈靖 杨欣 译

 

 

 


 

译  者  序

Hands-On Algorithms for Computer Vision

美国东部时间2012年6月25日,当《纽约时报》作家Jim Wilson写下《How Many Computers to Identify a Cat? 16,000》这篇报道时,应该只有很少人能预料到:这个现象及其背后的技术,将如此迅速而深刻地为一个时代的变革拉开序幕。当时的我,在准备赴美读博时也并未把机器学习作为可能的研究方向。两年后,博士肄业加入谷歌的我发现,无论愿意与否,计算机专业的热点已转到了人工智能和机器学习(尤其是深度学习),想要将自己置身于这浪潮之外会越来越难:不管是什么方向的技术峰会、专业论坛,人工智能和机器学习都是人们关心的方向,也是嘉宾和讲师必然会涉及的话题。

在机器学习的诸多领域中,计算机视觉是目前发展最成熟的方向之一,也是许多人接触机器学习算法的起点。深度学习之所以火起来,不正是始于吴恩达博士在谷歌大脑用深度学习算法让机器学会识别猫吗(在薛定谔的猫之后,猫又一次为科学发展做出了贡献)?同样,让机器更聪明地看与听,仍将是未来几年人工智能的主要课题之一。而随着国家AI+战略的推进,未来不只是计算机软硬件以及互联网行业的从业者会站在这波浪潮之巅,过去相对传统的行业也将被卷入其中。以在线教育为例:作业帮、一起作业网等能够拍照搜题;叮咚课堂、aiKID和葡萄英语能够进行简单的语音识别,用AI老师的方式跟孩子互动;而在51Talk,我们用人脸识别、表情识别来进行课堂质量监督并根据孩子的表现调整教学内容。在线教育只是冰山一角,在当下已经有成百上千的应用场景正在被AI深度影响甚至颠覆。

与其他计算机领域一样,理解计算机视觉算法需要坚实的数学基础。此外,读者最好还具备图像处理、信号与系统、计算机图形学等学科的背景及开发经验。开发者还要掌握各种基础算法和数据结构,以应对各种开发需求。当然,在移动设备成为主要个人计算平台的今天,针对不同硬件条件下图像和视频的采集、编解码、传输,以及不同处理器和片上系统(System on Chip,SoC)的优化与测试更是算法落地必不可少的技能。没有足够的理论知识和工程经验的初学者面对如此浩瀚繁多且异常艰深的内容将无从下手。

然而,本书和许多计算机视觉书籍的最大区别就在于隐藏了很多复杂的细节,绕开了相关算法的数学证明和实现,利用计算机视觉领域大名鼎鼎的OpenCV(Open Source Computer Vision library),让读者自己动手,实现一个个具体且实用的例子。这样的好处显而易见,读者在完成这些实例后能熟悉计算机视觉算法开发的整体流程,逐步树立自信。相关算法的细节可以通过研究OpenCV源代码,结合阅读相关书籍、论文来逐步补充学习。在译者看来,这是掌握一门技术的最佳路径。

本书特别适合计算机背景的学生和开发者学习阅读。全书在简单介绍了计算机视觉的基本概念和OpenCV的使用方法后,按照计算机视觉项目开发的难易程度,从基础的图像和视频的读写操作,到简单的图像矩阵运算,再到基础的图像处理、视频分析,最后到对象检测与机器学习分类算法,抽丝剥茧层层递进。本书还配备了完整的示例代码,有助于读者自主学习并验证各种算法的效果。同时,得益于OpenCV提供的工具、函数和类,这些示例代码都很轻量,非常易于理解。推荐读者在阅读本书时参考OpenCV的官方文档和其他图像处理、机器学习算法类的书籍,这样将会事半功倍。

译者在本书的翻译过程中,得到了北京大生在线科技有限公司(51Talk)的同事和华章公司编辑的大力协助,在此由衷感谢。

 

译者

 

 

 

 

前  言

Hands-On Algorithms for Computer Vision

我们正生活在一个激动人心的时代。每天你都能发现全新的软件或电子设备,它们为你完成特定工作、提供娱乐、联系亲朋好友、以图片或视频的形式记录你的生活等。不管是你口袋里巴掌大的智能手机、手腕上小巧的智能手表,还是你联网的智能汽车,大部分软件和设备的出现都归功于处理器技术的巨***展。更便宜、更快速的处理器能运行优秀的软件库和软件框架,使得一些过去被认为只能由人类感知器官(例如眼睛和耳朵)来完成的任务,可以通过数学算法和计算机技术高效地实现。

计算机视觉是计算机科学的一个分支领域,近年来,随着硬件和软件技术的发展,这个领域有了革命性的进步。反过来,计算机视觉也同样深刻地影响了硬件和软件的发展。如今,从数码相机拍照这样简单的任务到理解自动驾驶汽车的环境从而躲避车祸这样复杂的任务,计算机视觉被应用到各个方面。它可以在视频录像中把人脸换成兔子,也可以在显微镜影像中检测癌变细胞和组织从而挽救人的生命。说到计算机视觉应用的可能性,可以说是没有限制,尤其考虑到软件库和软件框架的巨大进步,公司和开发者可以把他们无穷无尽的想法变成现实。

在过去的几年里,OpenCV(全称是Open Source Computer Vision library,开源计算机视觉库)已经发展为一套完整的计算机视觉开发工具。它涵盖了几乎所有你能想到的解决计算机视觉问题所需的功能:从最基本的图像操作,如缩放和滤镜,到可用于快速准确地检测物体的机器学习算法训练模型。它也提供了开发计算机视觉应用需要的几乎所有模块,并支持一些最流行的编程语言,如C++和Python。你甚至能找到.NET框架的接口。OpenCV能在所有主流操作系统上运行,包括移动系统和桌面平台。

本书的目标是用实际的例子和项目教会读者如何使用OpenCV 来进行计算机视觉应用的开发。本书每一章都会讲解一些对应主题的计算机视觉算法,按照章节顺序,读者能学到大量可实际应用到项目中的计算机视觉算法。虽然本书大部分算法都是独立的,但强烈推荐读者从头开始阅读,并尝试按章节顺序建立计算机视觉知识体系。请读者亲手实践书中的每个例子,这些例子都很有趣,能让读者在实践过程中树立自信。

本书是数月辛勤工作的成果,而且如果没有 Tiksha Sarang 耐心而出色的编辑、Adhithya Haridas精准深刻的技术评审和批注以及 Sandeep Mishra 提供的这次难得的出版机会,本书是不可能完成的。感谢技术评审 Zhuo Qingliang 先生的大力帮助和其他所有协助我完成并出版这本书的 Packt 出版社的员工以及计算机视觉开源社区的成员。

本书的目标读者

任何有扎实 C++ 编程语言基础和第三方软件库使用经验的开发人员都能轻松阅读本书和上手书中的例子。另外,熟悉 Python 编程语言的开发者也能使用本书学习使用OpenCV 软件库,但需要自己把 C++ 的例子转为 Python,因为本书中出现的算法主要是 C++ 版的。

本书内容

第1章介绍计算机视觉科学的基础—它是什么,它用在哪,图像的定义和基本属性,例如像素、深度和通道等。该章比较短,是针对机器视觉领域的入门读者进行介绍的章节。

第2章通过概述OpenCV 开发最重要的组成模块来介绍OpenCV 软件库及其核心部件。读者也能了解如何获取和使用 OpenCV。该章会简略介绍用 CMake 创建 OpenCV 工程,让读者学会 Mat 类及其变体、图像视频的读写操作,以及获取摄像头输入(包括其他类型的输入方式)。

第3章涵盖了用于创建和修改矩阵的基础算法。读者将学习如何进行矩阵运算,比如向量乘积、标量乘积和矩阵求逆。除了求均值、求和和傅里叶变换这些数学运算,这一章将引入很多基于矩阵元素的运算。

第4章尽可能多地覆盖了本书涉及的各类图像处理算法。读者将学习如何在图像中绘制图形和文字,还将学习如何绘制直线、箭头、矩形等。该章还将展示各种广泛应用的图像滤镜操作算法,例如图像的平滑、膨胀、腐蚀和形态操作。学完该章,读者将熟悉功能强大的重映射算法和计算机视觉领域使用的各种色彩映射表。

第5章引入直方图的概念并介绍单通道和多通道图像计算直方图的方法。读者将学习灰度和彩***像的直方图数据可视化,或者说,由像素的色调值来计算直方图。读者还将学习反向投影这种直方图的逆运算。直方图的比较和均衡也是该章的主题。

第6章解释了如何处理视频,尤其是实时目标检测和追踪,这些操作运用了一些流行的计算机视觉追踪算法。在简略介绍了视频处理的基础知识之后,读者将结合实例学习目标追踪应用场景下的均值偏移(Mean Shift)、CAM偏移(CAM Shift)算法及卡尔曼滤波(Kalman filtering)。学完该章,读者将掌握背景和前景提取算法及其在实践中的使用方法。

第7章首先是目标检测的简介,接着引入各类用于形状分析的算法。该章涵盖的主题还包括关键点检测、描述符提取和描述符匹配,它们被用于基于特征(而不是基于简单的色调或亮度值)的目标检测中。

第8章涵盖了OpenCV 里的机器学习(ML)、深度神经网络(DNN)模块和一些重要的算法、类和函数。从SVM算法开始,读者将学习如何用多种类似的训练流程来训练模型,然后用模型来对输入进行分类。读者将学习如何用HOG描述符和SVM对图像分类。该章也涵盖了OpenCV中构建人工神经网络的方法,并介绍了级联分类。8.5节将教授读者如何使用第三方软件库生成的模型(例如TensorFlow 模型)来实时检测多个物体。

如何从书中获益更多

尽管所有章节里需要的工具和软件在每章的开头都有描述, 作为一个简单快速的参考,这里列表如下:

一台普通计算机,要求安装了较新版本的 Windows、macOS 或 Linux (比如 Ubuntu) 操作系统

Microsoft Visual Studio (Windows 系统)

Xcode (macOS 系统)

CMake

OpenCV

首先,读者可以通过网上搜索或是询问当地的计算机商店来了解目前主流计算机的配置,不过读者手头用的机器一般足够学习使用了。

另外,使用哪种集成开发环境(IDE)或是编译系统(在本例中为CMake)与书中提供的例子关系不大。例如,只要熟悉 OpenCV 软件库在其中的设置方法,读者完全可以使用任何代码编辑器或编译系统来学习书中的例子。

下载示例代码及彩***像

本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。

本书的代码包在https://github.com/PacktPublishing/Hands-On-Algorithms-for-Computer-Vision也能找到。这个GitHub仓库里的代码会保持更新。

约定

警告或要点使用这样的图标。

提示和技巧使用这样的图标。

 

 

 

关于作者

Hands-On Algorithms for Computer Vision

阿明·艾哈迈迪·塔兹赫孔迪(Amin Ahmadi Tazehkandi)是一位伊朗作家、软件开发人员和计算机视觉专家。他在伊朗完成了计算机软件工程学习,并为世界各地的众多软件和工业公司工作。

我要感谢我的妻子Senem,她是我的激情、爱和力量的象征。 我还要感谢我的家人,他们是一群由一位发明家父亲和慈爱的母亲所生的杰出工程师,感谢他们无条件的爱和支持。

 

 

 

关于审稿人

Hands-On Algorithms for Computer Vision

Zhuo Qingliang(KDr2 online)目前在金融科技创业公司 paodingai 工作,该公司致力于通过使用人工智能技术改善金融业。 他在Linux、C、C ++、Java、Python和Perl开发方面拥有超过10年的经验。 他对编程、咨询工作感兴趣并为开源社区提供帮助 。

他拥有一个个人网站KDr2,在那里你可以找到更多关于他的信息。

 

 

 

目  录

Hands-On Algorithms for Computer Vision


译者序

前言

关于作者

关于审稿人

第1章 计算机视觉概述  1

1.1 技术要求  1

1.2 理解计算机视觉  1

1.3 理解计算机图像  3

1.3.1 色彩空间  5

1.3.2 输入、处理和输出  7

1.4 计算机视觉框架和软件库  8

1.5 总结  9

1.6 习题  9

第2章 OpenCV入门  11

2.1 技术要求  12

2.2 OpenCV介绍  12

2.3 OpenCV的下载、编译和安装  14

2.4 在C++或Python项目中使用OpenCV  17

2.5 理解Mat类  19

2.5.1 创建一个Mat对象  20

2.5.2 删除一个Mat对象  23

2.5.3 访问像素  24

2.6 图像读写  27

2.7 视频文件读写  29

2.7.1 使用摄像头  31

2.7.2 使用RTSP和网络流媒体  32

2.8 Mat类家族  32

2.9 总结  32

2.10 习题  33

2.11 补充阅读  33

第3章 数组和矩阵操作  34

3.1 技术要求  34

3.2 Mat类中的操作  35

3.2.1 克隆矩阵  35

3.2.2 计算叉积  35

3.2.3 提取对角线  36

3.2.4 计算点积  36

3.2.5 学习单位矩阵  37

3.2.6 矩阵求逆  37

3.2.7 元素级矩阵乘法  37

3.2.8 全一和全零矩阵  37

3.2.9 矩阵转置  38

3.2.10 重塑Mat对象  39

3.3 元素级矩阵操作  39

3.3.1 基本操作  39

3.3.2 按位逻辑操作  43

3.3.3 比较操作  47

3.3.4 数学操作  48

3.4 矩阵和数组级操作  49

3.4.1 为外推法生成边界  50

3.4.2 翻转(镜像)和旋转图像  51

3.4.3 使用图像通道  52

3.4.4 数学函数  54

3.4.5 搜索和定位功能  58

3.5 总结  60

3.6 习题  61

第4章 绘图、滤镜和变换  62

4.1 技术要求  62

4.2 在图像上绘图  63

4.2.1 在图像上打印文字  63

4.2.2 在图像上绘制形状  66

4.3 图像滤镜  72

4.3.1 模糊/平滑滤镜  72

4.3.2 形态滤镜  76

4.3.3 基于导数的滤镜  79

4.3.4 任意滤镜  80

4.4 图像变换  81

4.4.1 阈值算法  81

4.4.2 色彩空间和类型转换  83

4.5 几何变换  84

4.6 使用色彩表  86

4.7 总结  88

4.8 习题  88

第5章 反向投影和直方图  89

5.1 技术要求  89

5.2 理解直方图  90

5.3 直方图反向投影  95

5.4 直方图比较  103

5.5 直方图均衡  105

5.6 总结  106

5.7 习题  107

5.8 补充阅读  107

第6章 视频分析——运动检测和

追踪  108

6.1 技术要求  108

6.2 视频处理  109

6.3 理解均值偏移算法  112

6.4 使用连续自适应均值偏移算法  119

6.5 使用卡尔曼滤波器进行运动追踪和降噪  122

6.6 如何提取背景和前景  129

6.7 总结  132

6.8 习题  132

第7章 对象检测——特征和描述符  133

7.1 技术要求  133

7.2 用于对象检测的模板匹配  134

7.3 检测角点和边缘  137

7.3.1 学习Harris角点检测算法  137

7.3.2 边缘检测算法  143

7.4 轮廓计算和分析  147

7.5 特征检测、描述和匹配  152

7.6 总结  158

7.7 习题  158

第8章 机器学习与计算机视觉  160

8.1 技术要求  160

8.2 支持向量机  161

8.3 用人工神经网络训练模型  169

8.4 级联分类算法  171

8.4.1 使用级联分类器进行对象检测  171

8.4.2 训练级联分类器  174

8.5 使用深度学习模型  180

8.6 总结  184

8.7 习题  184

习题答案  185


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。