
OpenCV在计算机视觉领域扮演着重要的角色。作为一个基于开源发行的跨平台计算机视觉库,OpenCV实现了图像处理和计算机视觉方面的很多通用算法。本书以当前最新版本的OpenCV最常用最核心的组件模块为索引,深入浅出地介绍了OpenCV2和OpenCV3中的强大功能、性能,以及新特性。书本配套的OpenCV2和OpenCV3双版本的示例代码包中,含有总计两百多个详细注释的程序源代码与思路说明。读者可以按图索骥,按技术方向进行快速上手和深入学习。 本书要求读者具有基础的C/C++知识,适合研究计算机视觉以及相关领域的在校学生和老师、初次接触OpenCV但有一定C/C++编程基础的研究人员,以及已有过OpenCV 1.0编程经验,想快速了解并上手OpenCV2、OpenCV3编程的计算机视觉领域的专业人员。本书也适合于图像处理、计算机视觉领域的业余爱好者、开源项目爱好者做为通向新版OpenCV的参考手册之用。 本书配套的【示例程序】、【.exe可执行文件】、【书内彩图】的下载链接可通过扫描本书封底或后勒口的二维码获取。
前 言 计算机视觉是一个近几年来日臻成熟的领域。随着运算性能强劲而又价格实惠的计算设备的不断问世,创建复杂的图像应用从未像今天这般容易。OpenCV在计算机视觉领域扮演着重要的角色,它是一个基于开源发行的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。自1999 年问世以来,OpenCV 已经被计算机视觉领域的学者和开发者视为首选工具,并成为了计算机视觉领域最有力的研究工具之一。 OpenCV 最初由Intel 的一个小组进行开发。在一系列的beta 版本后,OpenCV 1.0 正式版本终于在2006 年10 月19 日发布。2009 年10 月1 日,OpenCV 2.0 问世,它带来了全新的C++接口,将OpenCV的能力无限放大。在2.0 的时代,OpenCV 增加了全新的平台支持,包括iOS 和Andriod,通过CUDA 和OpenCL 实现了GPU 加速,为Python 和Java 用户提供了接口,基于Github 和Buildbot 构建了充满艺术感的持续集成的系统,所以才有 了被全世界的很多公司和学校所采用的稳定易用的OpenCV 2.4.x。2014 年8 月21 日,OpenCV 3.0 Alpha 发布,它带来了全新的项目架构的改变,宣告了计算机视觉新时代的来临。和其他大型项目一样,OpenCV3 抛弃了整体统一架构,使用内核+插件的架构形式,让自身主体更加稳定,而附加的库则可以更加灵活多变,以保持高速的发展与迭代。 本书源自于笔者在CSDN 上连载的名为“OpenCV 入门教程”的系列博客文章,自2014 年2 月24 日发表第一篇以来,得到了广大OpenCV 爱好者的广泛关注与支持,累计阅读量突破了40 多万人次。不少读者强烈希望将这些内容集结成书,并加入更多新的内容。于是,经过笔者半年的笔耕不辍,便有了现在这本书的诞生。 作为一本入门级的OpenCV 编程教材,本书以详细注释的程序代码为主线,以新版OpenCV 最核心的core、HighGUI、improc 和feature2d 这4 个组件的相关函数、类和数据结构为出发点,详细讲解了学习新版本OpenCV 中会遇到了各种问题,并提供了详尽的实战代码作为参考。本书的写作初衷是让更多的使用者能熟练使用采用新版C++接口的OpenCV2 或OpenCV3,了解OpenCV2 和OpenCV3的诸多细节上的区别,以推动新版OpenCV 在世界范围内的普及。 本书的内容安排 本书分为4 个部分、11 个章节,现将内容梗概列举如下。 第1 章 邂逅OpenCV:介绍OpenCV 的周边概念,分析OpenCV 的基本架构,讲解OpenCV3 的新特性。本章重点讲解了OpenCV 的下载、安装与配置过程;在配置完成后,带领大家正式领略OpenCV 的魅力,讲解了4 个OpenCV 图像处理小程序,并指导大家学习如何使用OpenCV 操作视频和调用摄像头。 第2 章 启程前的认知准备:进行OpenCV 官方例程的引导学习与赏析,讲解如何编译OpenCV 的源代码,并引入了对一些周边概念的认知。 第3 章 HighGUI 图形用户界面初步:对图像的载入、显示和输出到文件进行详细地分析,讲解OpenCV 中滑动条的创建和使用,以及如何用鼠标进行交互操作。 第4 章 OpenCV 数据结构与基本绘图: 讲解OpenCV 中常用的数据结构以及基本的绘图操作。 第5 章 core 组件进阶:讲解core 模块的一些进阶知识点,如操作图像中的像素、图像混合、分离颜色通道、调节图像的对比度和亮度、进行离散傅里叶变换,以及输入输出XML 和YAML 文件。 第6 章 图像处理:学习各种利用OpenCV 进行图像处理的方法,包括属于线性滤波的方框滤波、均值滤波与高斯滤波,属于非线性滤波的中值滤波、双边滤波;两种基本形态学操作——膨胀与腐蚀;5 种高级形态学滤波操作——开运算、闭运算、形态学梯度、顶帽以及黑帽;此外,还有漫水填充算法、图像金字塔、图像缩放、阈值化。 第7 章 图像变换:讲解多种类型的图像变换方法。包括利用OpenCV 进行边缘检测所用到的canny 算子、sobel 算子,Laplace 算子以及scharr 滤波器;进行图像特征提取的霍夫线变换、霍夫圆变换,重映射和仿射变换以及直方图均衡化。 第8 章 图像轮廓与图像分割修复: 讲解如何查找轮廓并绘制轮廓,如何寻找物体的凸包,使用多边形来包围轮廓,以及计算一个图像的矩。此外还介绍了分水岭算法和图像修补操作的实现方法。 第9 章 直方图与匹配:讲解图像直方图相关的编程技巧,以及直方图对比、 反向投影和模板匹配技术。 第10 章 角点检测:讲解Harris 角点检测和Shi-Tomasi 角点检测,以及一种亚像素角点检测方法。 第11 章 特征检测与匹配:使用OpenCV2 讲解并实现了SURF、SIFT 和ORB特征检测方法,并在FLANN 特征匹配的基础上,进一步实现了利用Homography映射来找出已知物体。 适合阅读本书的读者 􀁹 研究计算机视觉以及相关领域的在校学生和老师 本书拥有详实的内容,注释详尽的代码,会是助你通过OpenCV 来研习计算机视觉理论、撰写论文、通过毕业设计、完成科研项目的得力工具。同时,本书适合作为大学计算机视觉课程的教学用书。 􀁹 初次接触OpenCV、有一定C/C++编程基础的研究人员 作为一本定位为快速入门新版OpenCV 标准的编程教程,本书需要的仅仅是一些简单的C/C++编程语言基础。如果你已经具备了这些基础,并对计算机视觉感兴趣,那么本书正是为你所准备的。 􀁹 已经有过OpenCV 1.0 编程经验,想快速了解并上手OpenCV2、OpenCV3编程的计算机视觉领域的专业人员如果你曾经使用过OpenCV 1.0,或者研读过OpenCV 1.0 时代的经典著作 《Learning OpenCV》,本书会让你倍感亲切。你会发现新版OpenCV 带了更多强大和便利的特性,让你事半功倍,如虎添翼。 􀁹 想拥有一本新版OpenCV 接口工具书的计算机视觉爱好者本书中将自OpenCV2 以来(包括OpenCV3)的常用类和函数进行了详细地讲解,并在附录中提供了“书本核心函数清单”以便检索。你会在书中快速查找到你需要用到的函数、数据结构和类的用法。 􀁹 想拥有海量的详细注释的OpenCV2、OpenCV3 示例程序代码的OpenCV 爱 好者 本书包含OpenCV2 版的95 个书本主线示例程序源代码、21 个附赠示例程序源代码,OpenCV3 版的95 个书本主线示例程序源代码。OpenCV2、OpenCV3 两版代码提供分开下载。这些程序代码都经过详细而有条理的注释,并提供可以独立运行的.exe文件供快速查看程序效果,方便查看和检索。你会在海量的示例程序中找到你需要的参考代码,从而加速你的研究和学习。 􀁹 图像处理、计算机视觉领域的业余爱好者 海阔凭鱼跃,天高任鸟飞,计算机视觉领域的宝库任你探索。 􀁹 开源项目爱好者 OpenCV 作为一个完全免费并开源代码开发的计算机视觉代码库,有总计上百万行的源代码供你研究学习,本书将是引导你学习它们的良师益友。 本书的示例程序说明 本书的示例程序最初都在OpenCV 2.4.9(2014 年4 月15 日面世)版本下开发,书稿初版也是基于OpenCV 2.4.9 而写。在书稿写作和修订过程中,恰逢OpenCV 3.0 Alpha(2014 年8 月21 日)和OpenCV3 Beta(2014 年11 月11 日)的发布,所以本书在审校和修订过程中(2014 年12 月1 日),决定站在浪潮之巅,以OpenCV2 为主,加入OpenCV3 的诸多特性,让这本书可以同时胜任OpenCV2和OpenCV3 两个版本教材的角色。这也是为什么本书会有OpenCV2 和OpenCV3两个独立版本的示例程序的原因。两个版本、详细注释的100 多个示例程序源代码是本书的灵魂,现将示例程序的相关情况概括如下。 􀁹 本书包含OpenCV2 版的95 个书本主线示例程序源代码、21 个附赠示例程 序源代码,以及OpenCV3 版的95 个书本主线示例程序源代码。 􀁹 OpenCV2、OpenCV3 两版代码提供分开下载。 􀁹 OpenCV2 版的示例程序在Windows7 64 位旗舰版、Visual Stuido 2010 、OpenCV 2.4.9 的环境下开发与测试,理论上支持OpenCV2 系列的所有版本的编译运行。 􀁹 OpenCV3 版的示例程序在Windows7 64 位旗舰版、Visual Stuido 2010 、OpenCV 3.0 beta 的环境下开发与测试,理论上支持目前已经发布的OpenCV3 全版本。 􀁹 程序源代码都经过详细而有条理的注释。 􀁹 额外提供可以独立运行的.exe 文件供快速查看程序效果,并方便检索。 本书配套示例代码的下载方式有以下几种。 􀁹 扫描本书封面后勒口的二维码,得到下载地址。 􀁹 在作者博客(http://blog.csdn.net/poem_qianmo)中单击相应的书本维护博文里贴出的下载链接。 􀁹 在电子工业出版社的官方网站(http://www.phei.com.cn)中进行下载。 􀁹 直接用搜索引擎搜索“《OpenCV3 编程入门》书本配套源代码”,找到对应 的下载地址进行下载。 致谢 首先需要感谢我的导师,南京航空航天大学冷雪飞教授的知遇之恩,她也亲自参与撰写了本书的部分章节。在攻读硕士学位阶段,如果没有导师的谆谆教诲,我不会和OpenCV 相遇,也就不会有此书的出版。 感谢我的同门师兄王碧辉与吴松森参与撰写本书的部分章节,他们为本书的完善做出了卓越的贡献。 感谢OpenCV 开发团队为世界研发出如此强大且稳定、易用的计算机开源视觉库,并持续不断地对其进行维护与更新。 感谢父母将我养育成人,感谢家人们的嘘寒问暖,你们是我最坚强的后盾。 感谢母校南京航空航天大学赐予我一颗不甘平庸、上下求索的心。 感谢南京航空航天大学的戴泉晨老师对本书出版所做出的帮助与支持。 感谢国家自然科学基金青年科学基金项目“新型单定子二自由度超声电机及 其驱动的智能云台系统的关键技术研究”(项目批准号:51205193)对本书理论研究方面提供的经费支持。 感谢电子工业出版社博文视点的陈晓猛和丁一琼编辑为本书的出版所做的大量的工作,他们对出版物的专业和严谨的态度给我留下了深刻的印象。 最后,需要感谢我博客上的众多读者们,是你们对这本书的期待和热情的留 言让我有了完成这本书的动力和勇气。 交流与勘误 由于编者水平有限,书籍即使经过了多次的校对,也难免会有疏漏之处。希望书本前的你,能够热心地指出书本中错误,以便在这本书下一版印刷的时候,能以一个更完美更严谨的样子,呈现在大家的面前。另外,你要相信你不是一个人在战斗,在作者的博客中,可以找到与自己志同道合的众多喜欢计算机视觉编程技术的爱好者们。我们可以一同交流,共同学习进步。 最后,愿大家在本书的帮助下,都能很好地入门和掌握新版OpenCV。 愿本书能为新版OpenCV 在国内的普及以及在世界范围内的发展,献上绵薄之力。 作者博客地址:http://blog.csdn.net/poem_qianmo 作者联系邮箱:happylifemxy@163.com 作者新浪微博:@浅墨_毛星云 浅墨 2014 年12 月于南京
第一部分 快速上手OpenCV 1 第1 章 邂逅OpenCV 3 1 1 OpenCV 周边概念认知 4 1 1 1 图像处理、计算机视觉与OpenCV 4 1 1 2 OpenCV 概述 4 1 1 3 起源及发展 5 1 1 4 应用概述 6 1 2 OpenCV 基本架构分析 7 1 3 OpenCV3 带来了什么 11 1 3 1 项目架构的改变 11 1 3 2 将OpenCV2 代码升级到OpenCV3 报错时的一些策略 12 1 4 OpenCV 的下载、安装与配置 14 1 4 1 预准备:下载和安装集成开发环境 14 1 4 2 第一步:下载和安装OpenCV SDK 15 1 4 3 第二步:配置环境变量 16 1 4 4 第三步:工程包含(include)目录的配置 17 1 4 5 第四步:工程库(lib)目录的配置 21 1 4 6 第五步:链接库的配置 22 1 4 7 第六步:在Windows 文件夹下加入OpenCV 动态链接库 25 1 4 8 第七步:最终测试 26 1 4 9 可能遇到的问题和解决方案 27 1 5 快速上手OpenCV 图像处理 28 1 5 1 第一个程序:图像显示 29 1 5 2 第二个程序:图像腐蚀 30 1 5 3 第三个程序:图像模糊 31 1 5 4 第四个程序:canny 边缘检测 32 1 6 OpenCV 视频操作基础 34 1 6 1 读取并播放视频 34 1 6 2 调用摄像头采集图像 35 1 7 本章小结 38 目 录 X 第2 章 启程前的认知准备 39 2 1 OpenCV 官方例程引导与赏析 40 2 1 1 彩色目标跟踪:Camshift 41 2 1 2 光流:optical flow 42 2 1 3 点追踪:lkdemo 43 2 1 4 人脸识别:objectDetection 43 2 1 5 支持向量机引导 44 2 2 开源的魅力:编译OpenCV 源代码 45 2 2 1 下载安装CMake 45 2 2 2 使用CMake 生成OpenCV 源代码工程的解决方案 46 2 2 3 编译OpenCV 源代码 50 2 3 “opencv hpp”头文件认知 53 2 4 命名规范约定 54 2 5 argc 与argv 参数解惑 56 2 5 1 初识main 函数中的argc 和argv 56 2 5 2 argc、argv 的具体含义 57 2 5 3 Visual Studio 中main 函数的几种写法说明 58 2 5 4 总结 59 2 6 格式输出函数printf()简析 59 2 6 1 格式输出:printf()函数 59 2 6 2 示例程序:printf 函数的用法示例 60 2 7 智能显示当前使用的OpenCV 版本 61 2 8 本章小结 61 第3 章 HighGUI 图形用户界面初步 63 3 1 图像的载入、显示和输出到文件 64 3 1 1 OpenCV 的命名空间 64 3 1 2 Mat 类简析 64 3 1 3 图像的载入与显示概述 65 3 1 4 图像的载入:imread()函数 65 3 1 5 图像的显示:imshow()函数 66 3 1 6 关于InputArray 类型 67 3 1 7 创建窗口:namedWindow()函数 67 3 1 8 输出图像到文件:imwrite()函数 68 3 1 9 综合示例程序:图像的载入、显示与输出 70 3 2 滑动条的创建和使用 73 3 2 1 创建滑动条:createTrackbar()函数 73 3 2 2 获取当前轨迹条的位置:getTrackbarPos()函数 76 3 3 鼠标操作 76 3 4 本章小结 80 目 录 XI 第二部分 初探core 组件 83 第4 章 OpenCV 数据结构与基本绘图 85 4 1 基础图像容器Mat 86 4 1 1 数字图像存储概述 86 4 1 2 Mat 结构的使用 86 4 1 3 像素值的存储方法 88 4 1 4 显式创建Mat 对象的七种方法 89 4 1 5 OpenCV 中的格式化输出方法 91 4 1 6 输出其他常用数据结构 94 4 1 7 示例程序:基础图像容器Mat 类的使用 95 4 2 常用数据结构和函数 95 4 2 1 点的表示:Point 类 96 4 2 2 颜色的表示:Scalar 类 96 4 2 3 尺寸的表示:Size 类 96 4 2 4 矩形的表示:Rect 类 97 4 2 5 颜色空间转换:cvtColor()函数 98 4 2 6 其他常用的知识点 100 4 3 基本图形的绘制 100 4 3 1 DrawEllipse()函数的写法 101 4 3 2 DrawFilledCircle()函数的写法 102 4 3 3 DrawPolygon()函数的写法 102 4 3 4 DrawLine()函数的写法 103 4 3 5 main 函数的写法 104 4 4 本章小结 106 第5 章 core 组件进阶 107 5 1 访问图像中的像素 108 5 1 1 图像在内存之中的存储方式 108 5 1 2 颜色空间缩减 108 5 1 3 LUT 函数:Look up table 操作 109 5 1 4 计时函数 110 5 1 5 访问图像中像素的三类方法 110 5 1 6 示例程序 114 5 2 ROI 区域图像叠加&图像混合 114 5 2 1 感兴趣区域:ROI 115 5 2 2 线性混合操作 116 5 2 3 计算数组加权和:addWeighted()函数 117 5 2 4 综合示例:初级图像混合 120 目 录 XII 5 3 分离颜色通道、多通道图像混合 125 5 3 1 通道分离:split()函数 125 5 3 2 通道合并:merge()函数 126 5 3 3 示例程序:多通道图像混合 127 5 4 图像对比度、亮度值调整 131 5 4 1 理论依据 131 5 4 2 访问图片中的像素 131 5 4 3 示例程序:图像对比度、亮度值调整 132 5 5 离散傅里叶变换 135 5 5 1 离散傅里叶变换的原理 135 5 5 2 dft()函数详解 136 5 5 3 返回DFT 最优尺寸大小:getOptimalDFTSize()函数 137 5 5 4 扩充图像边界:copyMakeBorder()函数 137 5 5 5 计算二维矢量的幅值:magnitude()函数 138 5 5 6 计算自然对数:log()函数 138 5 5 7 矩阵归一化:normalize()函数 138 5 5 8 示例程序:离散傅里叶变换 139 5 6 输入输出XML 和YAML 文件 144 5 6 1 XML 和YAML 文件简介 144 5 6 2 FileStorage 类操作文件的使用引导 144 5 6 3 示例程序:XML 和YAML 文件的写入 147 5 6 4 示例程序:XML 和YAML 文件的读取 148 5 7 本章小结 150 第三部分 掌握imgproc 组件 151 第6 章 图像处理 153 6 1 线性滤波:方框滤波、均值滤波、高斯滤波 154 6 1 1 平滑处理 154 6 1 2 图像滤波与滤波器 154 6 1 3 线性滤波器的简介 155 6 1 4 滤波和模糊 155 6 1 5 邻域算子与线性邻域滤波 155 6 1 6 方框滤波(box Filter) 156 6 1 7 均值滤波 157 6 1 8 高斯滤波 159 6 1 9 线性滤波相关OpenCV 源码剖析 160 6 1 10 OpenCV 中GaussianBlur 函数源码剖析 164 6 1 11 线性滤波核心API 函数 165 6 1 12 图像线性滤波综合示例 170 目 录 XIII 6 2 非线性滤波:中值滤波、双边滤波 175 6 2 1 非线性滤波概述 175 6 2 2 中值滤波 175 6 2 3 双边滤波 177 6 2 4 非线性滤波相关核心API 函数 178 6 2 5 OpenCV 中的5 种图像滤波综合示例 181 6 3 形态学滤波(1):腐蚀与膨胀 187 6 3 1 形态学概述 187 6 3 2 膨胀 188 6 3 3 腐蚀 189 6 3 4 相关OpenCV 源码分析溯源 190 6 3 5 相关核心API 函数讲解 191 6 3 6 综合示例:腐蚀与膨胀 195 6 4 形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽 198 6 4 1 开运算 199 6 4 2 闭运算 200 6 4 3 形态学梯度 200 6 4 4 顶帽 201 6 4 5 黑帽 202 6 4 6 形态学滤波OpenCV 源码分析溯源 203 6 4 7 核心API 函数:morphologyEx() 205 6 4 8 各形态学操作使用范例一览 206 6 4 9 综合示例:形态学滤波 208 6 5 漫水填充 214 6 5 1 漫水填充的定义 214 6 5 2 漫水填充法的基本思想 214 6 5 3 实现漫水填充算法:floodFill 函数 214 6 5 4 综合示例:漫水填充 216 6 6 图像金字塔与图片尺寸缩放 223 6 6 1 引言 223 6 6 2 关于图像金字塔 223 6 6 3 高斯金字塔 225 6 6 4 拉普拉斯金字塔 226 6 6 5 尺寸调整:resize()函数 227 6 6 6 图像金字塔相关API 函数 230 6 6 7 综合示例:图像金字塔与图片尺寸缩放 234 6 7 阈值化 237 6 7 1 固定阈值操作:Threshold()函数 238 6 7 2 自适应阈值操作:adaptiveThreshold()函数 239 目 录 XIV 6 7 3 示例程序:基本阈值操作 240 6 8 本章小结 244 第7 章 图像变换 247 7 1 基于OpenCV 的边缘检测 248 7 1 1 边缘检测的一般步骤 248 7 1 2 canny 算子 248 7 1 3 sobel 算子 253 7 1 4 Laplacian 算子 256 7 1 5 scharr 滤波器 259 7 1 6 综合示例:边缘检测 262 7 2 霍夫变换 267 7 2 1 霍夫变换概述 267 7 2 2 OpenCV 中的霍夫线变换 268 7 2 3 霍夫线变换的原理 268 7 2 4 标准霍夫变换:HoughLines()函数 270 7 2 5 累计概率霍夫变换:HoughLinesP()函数 272 7 2 6 霍夫圆变换 274 7 2 7 霍夫梯度法的原理 275 7 2 8 霍夫梯度法的缺点 276 7 2 9 霍夫圆变换:HoughCircles()函数 276 7 2 10 综合示例:霍夫变换 278 7 3 重映射 281 7 3 1 重映射的概念 281 7 3 2 实现重映射:remap()函数 282 7 3 3 基础示例程序:基本重映射 283 7 3 4 综合示例程序:实现多种重映射 285 7 4 仿射变换 289 7 4 1 认识仿射变换 289 7 4 2 仿射变换的求法 290 7 4 3 进行仿射变换:warpAffine()函数 291 7 4 4 计算二维旋转变换矩阵:getRotationMatrix2D()函数 292 7 4 5 示例程序:仿射变换 292 7 5 直方图均衡化 295 7 5 1 直方图均衡化的概念和特点 296 7 5 2 实现直方图均衡化:equalizeHist()函数 297 7 5 3 示例程序:直方图均衡化 298 7 6 本章小结 300 目 录 XV 第8 章 图像轮廓与图像分割修复 303 8 1 查找并绘制轮廓 304 8 1 1 寻找轮廓:findContours()函数 304 8 1 2 绘制轮廓:drawContours()函数 305 8 1 3 基础示例程序:轮廓查找 306 8 1 4 综合示例程序:查找并绘制轮廓 308 8 2 寻找物体的凸包 312 8 2 1 凸包 312 8 2 2 寻找凸包:convexHull()函数 313 8 2 3 基础示例程序:凸包检测基础 313 8 2 4 综合示例程序:寻找和绘制物体的凸包 315 8 3 使用多边形将轮廓包围 318 8 3 1 返回外部矩形边界:boundingRect()函数 318 8 3 2 寻找最小包围矩形:minAreaRect()函数 318 8 3 3 寻找最小包围圆形:minEnclosingCircle()函数 318 8 3 4 用椭圆拟合二维点集:fitEllipse()函数 319 8 3 5 逼近多边形曲线:approxPolyDP()函数 319 8 3 6 基础示例程序:创建包围轮廓的矩形边界 319 8 3 7 基础示例程序:创建包围轮廓的圆形边界 321 8 3 8 综合示例程序:使用多边形包围轮廓 324 8 4 图像的矩 327 8 4 1 矩的计算:moments()函数 328 8 4 2 计算轮廓面积:contourArea()函数 328 8 4 3 计算轮廓长度:arcLength()函数 328 8 4 4 综合示例程序:查找和绘制图像轮廓矩 329 8 5 分水岭算法 333 8 5 1 实现分水岭算法:watershed()函数 334 8 5 2 综合示例程序:分水岭算法 334 8 6 图像修补 338 8 6 1 实现图像修补:inpaint()函数 340 8 6 2 综合示例程序:图像修补 341 8 7 本章小结 343 第9 章 直方图与匹配 345 9 1 图像直方图概述 346 9 2 直方图的计算与绘制 347 9 2 1 计算直方图:calcHist()函数 347 9 2 2 找寻最值:minMaxLoc()函数 348 9 2 3 示例程序:绘制H—S 直方图 348 目 录 XVI 9 2 4 示例程序:计算并绘制图像一维直方图 350 9 2 5 示例程序:绘制RGB 三色直方图 352 9 3 直方图对比 355 9 3 1 对比直方图:compareHist()函数 355 9 3 2 示例程序:直方图对比 356 9 4 反向投影 360 9 4 1 引言 360 9 4 2 反向投影的工作原理 360 9 4 3 反向投影的作用 361 9 4 4 反向投影的结果 361 9 4 5 计算反向投影:calcBackProject()函数 361 9 4 6 通道复制:mixChannels()函数 362 9 4 7 综合程序:反向投影 363 9 5 模板匹配 367 9 5 1 模板匹配的概念与原理 367 9 5 2 实现模板匹配:matchTemplate()函数 367 9 5 3 综合示例:模板匹配 369 9 6 本章小结 373 第四部分 深入feature2d 组件 375 第10 章 角点检测 377 10 1 Harris 角点检测 378 10 1 1 兴趣点与角点 378 10 1 2 角点检测 378 10 1 3 harris 角点检测 379 10 1 4 实现Harris 角点检测:cornerHarris()函数 379 10 1 5 综合示例:harris 角点检测与绘制 381 10 2 Shi-Tomasi 角点检测 384 10 2 1 Shi-Tomasi 角点检测概述 384 10 2 2 确定图像强角点:goodFeaturesToTrack()函数 384 10 2 3 综合示例:Shi-Tomasi 角点检测 385 10 3 亚像素级角点检测 388 10 3 1 背景概述 388 10 3 2 寻找亚像素角点:cornerSubPix()函数 389 10 3 3 综合示例:亚像素级角点检测 389 10 4 本章小结 392 第11 章 特征检测与匹配 395 11 1 SURF 特征点检测 396 目 录 XVII 11 1 1 SURF 算法概览 396 11 1 2 SURF 算法原理 396 11 1 3 SURF 类相关OpenCV 源码剖析 400 11 1 4 绘制关键点:drawKeypoints()函数 401 11 1 5 KeyPoint 类 402 11 1 6 示例程序:SURF 特征点检测 402 11 2 SURF 特征提取 405 11 2 1 绘制匹配点:drawMatches()函数 405 11 2 2 BruteForceMatcher 类源码分析 407 11 2 3 示例程序:SURF 特征提取 408 11 3 使用FLANN 进行特征点匹配 410 11 3 1 FlannBasedMatcher 类的简单分析 410 11 3 2 找到最佳匹配:DescriptorMatcher::match 方法 411 11 3 3 示例程序: 使用FLANN 进行特征点匹配 411 11 3 4 综合示例程序:FLANN 结合SURF 进行关键点的描述和匹配 413 11 3 5 综合示例程序:SIFT 配合暴力匹配进行关键点描述和提取 417 11 4 寻找已知物体 420 11 4 1 寻找透视变换:findHomography()函数 421 11 4 2 进行透视矩阵变换:perspectiveTransform()函数 421 11 4 3 示例程序: 寻找已知物体 422 11 5 ORB 特征提取 425 11 5 1 ORB 算法概述 425 11 5 2 相关概念认知 425 11 5 3 ORB 类相关源码简单分析 426 11 5 4 示例程序:ORB 算法描述与匹配 426 11 6 本章小结 430 附录 433 A1 配套示例程序清单 433 A2 随书额外附赠的程序一览 436 A3 书本核心函数清单 439 A4 Mat 类函数一览 442 A4 1 构造函数:Mat::Mat 442 A4 2 析构函数Mat::~Mat 444 A4 3 Mat 类成员函数 444 主要参考文献 447