前 言 Preface
特别是对于现代机器而言,计算机视觉是环境感知发展的下一个阶段。许多现代设备尝试使用有限的资源来模仿人类的感知能力。此外,大多数此类仿制品其实是存在不足的,因为通常情况下它们不能直接模拟人类的感知能力,尤其是在视觉方面。
即使传统传感器的种类有很多,它们仍然无法表现出人类视觉系统的强大,这是人类最复杂的感知功能之一。因此,我们需要一定的视觉信息,使我们的电子系统更加智能化。这就是计算机视觉出现的原因。
相机可以被视为终极视觉传感器,它非常接近于人类的视觉感知系统。但是问题在于,如果使用相机作为视觉传感器,那么操作会非常复杂和困难。本书的目的是通过把一个复杂的问题划分为基本的、可实现的子步骤从而让计算机视觉的任务变得简单。这种方法最好的地方在于我们能把实际生活中的应用也变得很容易!
当我们处理现实生活中的应用时,毫无疑问应该有一种方法来与现实生活进行交互。嵌入式系统正好用来表示这些物理交互。Arduino是最流行的嵌入式系统平台之一,它通过海量的社区支持和学习材料为原型开发提供了一种便捷的方法。同时Arduino的关键属性也很棒,稍后将进行更详细的讨论,这些使得Arduino成为视觉系统与现实生活进行交互的最完美的候选。
Arduino在计算机视觉系统中扮演的角色是非常清楚的。在大多数情况下,视觉信息会与来自各种传统的传感器的数据相结合,这些传统的传感器包括温度传感器、压力传感器和加速器等。此外,我们需要一个很好的工具来在视觉处理过程之后采取物理行动,比如驱动电动机和开灯。因此,Arduino在从环境中收集数据并采取行动的过程中非常有用,特别是因为它有大量开发好的库以及社区共享,使得原型开发非常迅速。
开源计算机视觉库(OpenCV)是一个包含大量优化算法的优秀开源库。OpenCV最重要的优势之一是它可以支持多个平台,它能够在Windows、Linux、Mac OS甚至是Android和iOS平台上工作。更重要的是它是一个成熟的库,在写作本书时最新版本为3.0(和2.4.11)。出于这些原因,本书中所有的计算机视觉任务都将采用OpenCV来实现!
本书将通过一种通用的、明确的、可应用的方式来融合Arduino和计算机视觉的能力。书中的实践和方法可用于任何相关的问题和平台。本书想实现的最终目标是让你可以通过一种通用方法使用各种组件来解决现实生活中任意类型的视觉问题。
在每一章中,你将会找到有关主题在现实生活中实际应用的例子。为了学以致用,我们会一步一步地建立一个视觉机器人。你会发现尽管问题的背景有很大的不同,解决问题的方法都是一样的并且很简单!
本书的主要内容
第1章通过介绍一种对现实生活视觉问题有效的解决办法来解释设计模块和体系。
第2章讲述OpenCV库的基本原理以及如何在不同的操作系统平台安装和测试OpenCV库。
第3章通过实用的技巧和现实生活的例子来展示从环境中收集数据的有效方法。
第4章介绍OpenCV库中的内置滤波器以及如何根据应用程序的上下文来选择和实现这些滤波器。
第5章探索如何从视觉数据中提取有意义的信息以及如何让这些提取出来的数据为识别系统做好准备。
第6章通过实践的方式探索人工智能的方法,讨论在一个给定场景中检测和识别物体的方法。
第7章揭示Arduino的通信能力以及在OpenCV的环境中连接Arduino的综合性最佳实践。
第8章演示如何通过物理行为优雅地与现实世界进行交互。
第9章综合前面所学的所有知识来设计和开发一个全功能一体化的机器人。该章还将介绍所提出的方法如何在问题独立的情况下取得成功。
Contents 目 录
译者序
作者简介
前言
第1章 计算机视觉系统综述
1.1 计算机视觉系统介绍
1.2 解决计算机视觉问题
1.2.1 数据采集
1.2.2 预处理
1.2.3 图像处理的特征提取 5
1.2.4 后处理和后置滤波
1.2.5 识别或检测
1.2.6 在现实世界中行动
1.2.7 连接子模块
1.3 总结
第2章 OpenCV的基础与安装
2.1 OpenCV的基础
2.2 OpenCV的安装
2.2.1 在Linux上安装OpenCV
2.2.2 在Mac OS上安装OpenCV
2.2.3 在Windows上安装OpenCV
2.2.4 在iOS上安装OpenCV
2.2.5 在Android上安装OpenCV
2.3 总结
第3章 用OpenCV和Arduino进行数据采集
3.1 图像和视频采集
3.1.1 相机选择
3.1.2 图像采集
3.2 传感器数据采集
3.2.1 设置Arduino环境
3.2.2 传感器基础
3.2.3 从温度传感器中读取数据
3.3 总结
第4章 用OpenCV进行数据过滤
4.1 开始过滤
4.2 空间域滤波
4.2.1 平滑
4.2.2 锐化
4.3 颜色空间转换
4.3.1 灰度化
4.3.2 二值化
4.4 形态学滤波器
4.4.1 腐蚀和膨胀
4.4.2 开运算和闭运算
4.5 梯度和边缘检测
4.5.1 Canny边缘检测器
4.5.2 LoG滤波器
4.5.3 Sobel
4.6 自定义滤波器
4.7 直方图均衡化
4.8 本章的实践项目
4.9 总结
第5章 用OpenCV进行视觉数据处理
5.1 提取特征
5.1.1 使用基本的统计信息
5.1.2 使用颜色特征
5.1.3 使用模板进行特征匹配
5.1.4 使用轮廓特征
5.1.5 使用凸包
5.1.6 使用矩
5.1.7 使用Hough变换
5.1.8 使用角点
5.1.9 使用尺度不变特征变换
5.1.10 使用加速鲁棒特征
5.1.11 使用ORB
5.1.12 使用blob分析
5.2 总结
第6章 用OpenCV进行识别
6.1 构建一个可以思考的应用程序
6.1.1 模板匹配
6.1.2 特征匹配
6.1.3 基于快速近似最近邻搜索库的匹配
6.1.4 使用级联分类器
6.1.5 使用支持向量机
6.2 总结
第7章 用OpenCV与Arduino进行通信
7.1 与Arduino进行通信
7.1.1 有线通信
7.1.2 无线通信
7.2 用Java进行通信
7.3 用C++进行通信
7.4 总结
第8章 将Arduino用于真实世界
8.1 与电动机的连接
8.1.1 驱动直流电动机
8.1.2 驱动步进电动机
8.1.3 驱动伺服电动机
8.2 使用显示器
8.2.1 使用液晶显示器
8.2.2 使用薄膜晶体管显示器
8.3 总结
第9章 建造一个点击行走机器人
9.1 系统总览
9.2 建造一个机器人
9.2.1 构建力学部分
9.2.2 构建电子电路部分
9.2.3 构建机器人控制器和通信系统
9.3 构建视觉应用程序
9.4 总结