第一部分 快速上手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
· · · · · · (
收起)