第一部分 快速上手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.2OpenCV 基本架构分析 7 1.3OpenCV3 带来了什么 11 1.3.1 项目架构的改变 11 1.3.2 将OpenCV2 代码升级到OpenCV3 报错时的一些策略 12 1.4OpenCV 的下载、安装与配置 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.6OpenCV 视频操作基础 34 1.6.1 读取并播放视频 34 1.6.2 调用摄像头采集图像 35 1.7 本章小结 38 第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.5argc 与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 第二部分 初探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.2ROI 区域图像叠加&图像混合 114 5.2.1 感兴趣区域:ROI 115 5.2.2 线性混合操作 116 5.2.3 计算数组加权和:addWeighted()函数 117 5.2.4 综合示例:初级图像混合 120 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 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 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 第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 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.2Shi-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 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.2SURF 特征提取 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.5ORB 特征提取 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
第一部分 快速上手OpenCV 1第1 章 邂逅OpenCV 31.1 OpenCV 周边概念认知 41.1.1 图像处理、计算机视觉与OpenCV 41.1.2 OpenCV 概述 41.1.3 起源及发展 51.1.4 应用概述 61.2OpenCV 基本架构分析 71.3OpenCV3 带来了什么 111.3.1 项目架构的改变 111.3.2 将OpenCV2 代码升级到OpenCV3 报错时的一些策略 121.4OpenCV 的下载、安装与配置 141.4.1 预准备:下载和安装集成开发环境 141.4.2 第一步:下载和安装OpenCV SDK 151.4.3 第二步:配置环境变量 161.4.4 第三步:工程包含(include)目录的配置 171.4.5 第四步:工程库(lib)目录的配置 211.4.6 第五步:链接库的配置 221.4.7 第六步:在Windows 文件夹下加入OpenCV 动态链接库 251.4.8 第七步:最终测试 261.4.9 可能遇到的问题和解决方案 271.5快速上手OpenCV 图像处理 281.5.1 第一个程序:图像显示 291.5.2 第二个程序:图像腐蚀 301.5.3 第三个程序:图像模糊 311.5.4 第四个程序:canny 边缘检测 321.6OpenCV 视频操作基础 341.6.1 读取并播放视频 341.6.2 调用摄像头采集图像 351.7 本章小结 38
第2 章 启程前的认知准备 392.1 OpenCV 官方例程引导与赏析 402.1.1 彩色目标跟踪:Camshift 412.1.2 光流:optical flow 422.1.3 点追踪:lkdemo 432.1.4 人脸识别:objectDetection 432.1.5 支持向量机引导 442.2.开源的魅力:编译OpenCV 源代码 452.2.1 下载安装CMake 452.2.2 使用CMake 生成OpenCV 源代码工程的解决方案 462.2.3 编译OpenCV 源代码 502.3.“opencv hpp”头文件认知 532.4命名规范约定 542.5argc 与argv 参数解惑 562.5.1 初识main 函数中的argc 和argv 562.5.2 argc、argv 的具体含义 572.5.3 Visual Studio 中main 函数的几种写法说明 582.5.4 总结 592.6格式输出函数printf()简析 592.6.1 格式输出:printf()函数 592.6.2 示例程序:printf 函数的用法示例 602.7智能显示当前使用的OpenCV 版本 612.8本章小结 61第3 章 HighGUI 图形用户界面初步 633.1 图像的载入、显示和输出到文件 643.1.1 OpenCV 的命名空间 643.1.2 Mat 类简析 643.1.3 图像的载入与显示概述 653.1.4 图像的载入:imread()函数 653.1.5 图像的显示:imshow()函数 663.1.6 关于InputArray 类型 673.1.7 创建窗口:namedWindow()函数 673.1.8 输出图像到文件:imwrite()函数 683.1.9 综合示例程序:图像的载入、显示与输出 703.2滑动条的创建和使用 733.2.1 创建滑动条:createTrackbar()函数 733.2.2 获取当前轨迹条的位置:getTrackbarPos()函数 763.3鼠标操作 763.4本章小结 80
第二部分 初探core 组件 83第4 章 OpenCV 数据结构与基本绘图 854.1 基础图像容器Mat 864.1.1 数字图像存储概述 864.1.2 Mat 结构的使用 864.1.3 像素值的存储方法 884.1.4 显式创建Mat 对象的七种方法 894.1.5 OpenCV 中的格式化输出方法 914.1.6 输出其他常用数据结构 944.1.7 示例程序:基础图像容器Mat 类的使用 954.2常用数据结构和函数 954.2.1 点的表示:Point 类 964.2.2 颜色的表示:Scalar 类 964.2.3 尺寸的表示:Size 类 964.2.4 矩形的表示:Rect 类 974.2.5 颜色空间转换:cvtColor()函数 984.2.6 其他常用的知识点 1004.3基本图形的绘制 1004.3.1 DrawEllipse()函数的写法 1014.3.2 DrawFilledCircle()函数的写法 1024.3.3 DrawPolygon()函数的写法 1024.3.4 DrawLine()函数的写法 1034.3.5 main 函数的写法 1044.4 本章小结 106第5 章 core 组件进阶 1075.1 访问图像中的像素 1085.1.1 图像在内存之中的存储方式 1085.1.2 颜色空间缩减 1085.1.3 LUT 函数:Look up table 操作 1095.1.4 计时函数 1105.1.5 访问图像中像素的三类方法 1105.1.6 示例程序 1145.2ROI 区域图像叠加&图像混合 1145.2.1 感兴趣区域:ROI 1155.2.2 线性混合操作 1165.2.3 计算数组加权和:addWeighted()函数 1175.2.4 综合示例:初级图像混合 1205.3 分离颜色通道、多通道图像混合 1255.3.1 通道分离:split()函数 1255.3.2 通道合并:merge()函数 1265.3.3 示例程序:多通道图像混合 1275.4 图像对比度、亮度值调整 1315.4.1 理论依据 1315.4.2 访问图片中的像素 1315.4.3 示例程序:图像对比度、亮度值调整 1325.5离散傅里叶变换 1355.5.1 离散傅里叶变换的原理 1355.5.2 dft()函数详解 1365.5.3 返回DFT 最优尺寸大小:getOptimalDFTSize()函数 1375.5.4 扩充图像边界:copyMakeBorder()函数 1375.5.5 计算二维矢量的幅值:magnitude()函数 1385.5.6 计算自然对数:log()函数 1385.5.7 矩阵归一化:normalize()函数 1385.5.8 示例程序:离散傅里叶变换 1395.6输入输出XML 和YAML 文件 1445.6.1 XML 和YAML 文件简介 1445.6.2 FileStorage 类操作文件的使用引导 1445.6.3 示例程序:XML 和YAML 文件的写入 1475.6.4 示例程序:XML 和YAML 文件的读取 1485.7 本章小结 150第三部分 掌握imgproc 组件 151第6 章 图像处理 1536.1 线性滤波:方框滤波、均值滤波、高斯滤波 1546.1.1 平滑处理 1546.1.2 图像滤波与滤波器 1546.1.3 线性滤波器的简介 1556.1.4 滤波和模糊 1556.1.5 邻域算子与线性邻域滤波 1556.1.6 方框滤波(box Filter) 1566.1.7 均值滤波 1576.1.8 高斯滤波 1596.1.9 线性滤波相关OpenCV 源码剖析 1606.1.10 OpenCV 中GaussianBlur 函数源码剖析 1646.1.11 线性滤波核心API 函数 1656.1.12 图像线性滤波综合示例 1706.2 非线性滤波:中值滤波、双边滤波 1756.2.1 非线性滤波概述 1756.2.2 中值滤波 1756.2.3 双边滤波 1776.2.4 非线性滤波相关核心API 函数 1786.2.5 OpenCV 中的5 种图像滤波综合示例 1816.3形态学滤波(1):腐蚀与膨胀 1876.3.1 形态学概述 1876.3.2 膨胀 1886.3.3 腐蚀 1896.3.4 相关OpenCV 源码分析溯源 1906.3.5 相关核心API 函数讲解 1916.3.6 综合示例:腐蚀与膨胀 1956.4形态学滤波(2):开运算、闭运算、形态学梯度、顶帽、黑帽 1986.4.1 开运算 1996.4.2 闭运算 2006.4.3 形态学梯度 2006.4.4 顶帽 2016.4.5 黑帽 2026.4.6 形态学滤波OpenCV 源码分析溯源 2036.4.7 核心API 函数:morphologyEx() 2056.4.8 各形态学操作使用范例一览 2066.4.9 综合示例:形态学滤波 2086.5漫水填充 2146.5.1 漫水填充的定义 2146.5.2 漫水填充法的基本思想 2146.5.3 实现漫水填充算法:floodFill 函数 2146.5.4 综合示例:漫水填充 2166.6图像金字塔与图片尺寸缩放 2236.6.1 引言 2236.6.2 关于图像金字塔 2236.6.3 高斯金字塔 2256.6.4 拉普拉斯金字塔 2266.6.5 尺寸调整:resize()函数 2276.6.6 图像金字塔相关API 函数 2306.6.7 综合示例:图像金字塔与图片尺寸缩放 2346.7阈值化 2376.7.1 固定阈值操作:Threshold()函数 2386.7.2 自适应阈值操作:adaptiveThreshold()函数 2396.7.3 示例程序:基本阈值操作 2406.8 本章小结 244第7 章 图像变换 2477.1 基于OpenCV 的边缘检测 2487.1.1 边缘检测的一般步骤 2487.1.2 canny 算子 2487.1.3 sobel 算子 2537.1.4 Laplacian 算子 2567.1.5 scharr 滤波器 2597.1.6 综合示例:边缘检测 2627.2霍夫变换 2677.2.1 霍夫变换概述 2677.2.2 OpenCV 中的霍夫线变换 2687.2.3 霍夫线变换的原理 2687.2.4 标准霍夫变换:HoughLines()函数 2707.2.5 累计概率霍夫变换:HoughLinesP()函数 2727.2.6 霍夫圆变换 2747.2.7 霍夫梯度法的原理 2757.2.8 霍夫梯度法的缺点 2767.2.9 霍夫圆变换:HoughCircles()函数 2767.2.10 综合示例:霍夫变换 2787.3重映射 2817.3.1 重映射的概念 2817.3.2 实现重映射:remap()函数 2827.3.3 基础示例程序:基本重映射 2837.3.4 综合示例程序:实现多种重映射 2857.4仿射变换 2897.4.1 认识仿射变换 2897.4.2 仿射变换的求法 2907.4.3 进行仿射变换:warpAffine()函数 2917.4.4 计算二维旋转变换矩阵:getRotationMatrix2D()函数 2927.4.5 示例程序:仿射变换 2927.5直方图均衡化 2957.5.1 直方图均衡化的概念和特点 2967.5.2 实现直方图均衡化:equalizeHist()函数 2977.5.3 示例程序:直方图均衡化 2987.6本章小结 300
第8 章 图像轮廓与图像分割修复 3038.1 查找并绘制轮廓 3048.1.1 寻找轮廓:findContours()函数 3048.1.2 绘制轮廓:drawContours()函数 3058.1.3 基础示例程序:轮廓查找 3068.1.4 综合示例程序:查找并绘制轮廓 3088.2寻找物体的凸包 3128.2.1 凸包 3128.2.2 寻找凸包:convexHull()函数 3138.2.3 基础示例程序:凸包检测基础 3138.2.4 综合示例程序:寻找和绘制物体的凸包 3158.3使用多边形将轮廓包围 3188.3.1 返回外部矩形边界:boundingRect()函数 3188.3.2 寻找最小包围矩形:minAreaRect()函数 3188.3.3 寻找最小包围圆形:minEnclosingCircle()函数 3188.3.4 用椭圆拟合二维点集:fitEllipse()函数 3198.3.5 逼近多边形曲线:approxPolyDP()函数 3198.3.6 基础示例程序:创建包围轮廓的矩形边界 3198.3.7 基础示例程序:创建包围轮廓的圆形边界 3218.3.8 综合示例程序:使用多边形包围轮廓 3248.4图像的矩 3278.4.1 矩的计算:moments()函数 3288.4.2 计算轮廓面积:contourArea()函数 3288.4.3 计算轮廓长度:arcLength()函数 3288.4.4 综合示例程序:查找和绘制图像轮廓矩 3298.5分水岭算法 3338.5.1 实现分水岭算法:watershed()函数 3348.5.2 综合示例程序:分水岭算法 3348.6图像修补 3388.6.1 实现图像修补:inpaint()函数 3408.6.2 综合示例程序:图像修补 3418.7 本章小结 343第9 章 直方图与匹配 3459.1 图像直方图概述 3469.2 直方图的计算与绘制 3479.2.1 计算直方图:calcHist()函数 3479.2.2 找寻最值:minMaxLoc()函数 3489.2.3 示例程序:绘制H—S 直方图 3489.2.4 示例程序:计算并绘制图像一维直方图 3509.2.5 示例程序:绘制RGB 三色直方图 3529.3直方图对比 3559.3.1 对比直方图:compareHist()函数 3559.3.2 示例程序:直方图对比 3569.4反向投影 3609.4.1 引言 3609.4.2 反向投影的工作原理 3609.4.3 反向投影的作用 3619.4.4 反向投影的结果 3619.4.5 计算反向投影:calcBackProject()函数 3619.4.6 通道复制:mixChannels()函数 3629.4.7 综合程序:反向投影 3639.5模板匹配 3679.5.1 模板匹配的概念与原理 3679.5.2 实现模板匹配:matchTemplate()函数 3679.5.3 综合示例:模板匹配 3699.6本章小结 373第四部分 深入feature2d 组件 375第10 章 角点检测 37710.1 Harris 角点检测 37810.1.1 兴趣点与角点 37810.1.2 角点检测 37810.1.3 harris 角点检测 37910.1.4 实现Harris 角点检测:cornerHarris()函数 37910.1.5 综合示例:harris 角点检测与绘制 38110.2Shi-Tomasi 角点检测 38410.2.1 Shi-Tomasi 角点检测概述 38410.2.2 确定图像强角点:goodFeaturesToTrack()函数 38410.2.3 综合示例:Shi-Tomasi 角点检测 38510.3亚像素级角点检测 38810.3.1 背景概述 38810.3.2 寻找亚像素角点:cornerSubPix()函数 38910.3.3 综合示例:亚像素级角点检测 38910.4 本章小结 392第11 章 特征检测与匹配 39511.1 SURF 特征点检测 39611.1.1 SURF 算法概览 39611.1.2 SURF 算法原理 39611.1.3 SURF 类相关OpenCV 源码剖析 40011.1.4 绘制关键点:drawKeypoints()函数 40111.1.5 KeyPoint 类 40211.1.6 示例程序:SURF 特征点检测 40211.2SURF 特征提取 40511.2.1 绘制匹配点:drawMatches()函数 40511.2.2 BruteForceMatcher 类源码分析 40711.2.3 示例程序:SURF 特征提取 40811.3.使用FLANN 进行特征点匹配 41011.3.1 FlannBasedMatcher 类的简单分析 41011.3.2 找到最佳匹配:DescriptorMatcher::match 方法 41111.3.3 示例程序: 使用FLANN 进行特征点匹配 41111.3.4 综合示例程序:FLANN 结合SURF 进行关键点的描述和匹配 41311.3.5 综合示例程序:SIFT 配合暴力匹配进行关键点描述和提取 41711.4寻找已知物体 42011.4.1 寻找透视变换:findHomography()函数 42111.4.2 进行透视矩阵变换:perspectiveTransform()函数 42111.4.3 示例程序: 寻找已知物体 42211.5ORB 特征提取 42511.5.1 ORB 算法概述 42511.5.2 相关概念认知 42511.5.3 ORB 类相关源码简单分析 42611.5.4 示例程序:ORB 算法描述与匹配 42611.6 本章小结 430附录 433A1 配套示例程序清单 433A2 随书额外附赠的程序一览 436A3 书本核心函数清单 439A4 Mat 类函数一览 442A4.1 构造函数:Mat::Mat 442A4.2 析构函数Mat::~Mat 444A4.3 Mat 类成员函数 444主要参考文献 447