计算机视觉是在图像处理的基础上发展起来的新兴学科。OpenCV是一个开源的计算机视觉库,是英特尔公司资助的两大图像处理利器之一。它为图像处理、模式识别、三维重建、物体跟踪、机器学习和线性代数提供了各种各样的算法。《学习OpenCV 3(中文版)》由OpenCV发起人所写,站在一线开发人员的角度用通俗易懂的语言解释了OpenCV的缘起和计算机视觉基础结构,演示了如何用OpenCV和现有的自由代码为各种各样的机器进行编程,这些都有助于读者迅速入门并渐入佳境,兴趣盎然地深入探索计算机视觉领域。《学习OpenCV 3(中文版)》可作为信息处理、计算机、机器人、人工智能、遥感图像处理、认知神经科学等有关专业的高年级学生或研究生的教学用书,也可供相关领域的研究工作者参考。
OpenCV库包含500多个函数,2500多种算法,可以扩展应用到视觉行业中的很多领域,有广泛的用途,比如安保,医学成像,模式与人脸识别,机器人和工业产品检测,等等。《学习OpenCV 3(中文版)》实用性强,内容全面,讲解透彻,可以帮助读者掌握如何构建具有一定AI(人工智能)的应用程序,使计算机能够“看见”并根据所得到的数据来做出决策。《学习OpenCV 3(中文版)》全面介绍整个OpenCV库,所有示例代码都用C++实现,同时还介绍了可以用于计算机视觉的机器学习工具。《学习OpenCV 3(中文版)》每一章都精心设计有动手练习,旨在方便课堂教学和自学,进一步帮助读者学以致用。
通过学习《学习OpenCV 3(中文版)》,读者可以奠定扎实的基础,运用计算机视觉相关知识和OpenCV库来构建简单的或者精巧复杂的应用程序。
译者序 xvii
前言 xxi
1章 概述 1
什么是OpenCV 1
OpenCV怎么用 2
什么是计算机视觉 3
OpenCV的起源 6
OpenCV的结构 7
使用IPP来加速OpenCV 8
谁拥有OpenCV 9
下载和安装OpenCV 9
安装 9
从Git获取新的OpenCV 12
更多的OpenCV文档 13
提供的文档 13
在线文档和维基资源 13
OpenCV贡献库 15
下载和编译Contributed模块 16
可移植性 16
小结 17
练习 17
2章OpenCV初探 19
头文件 19
资源 20
一个程序:显示图片 21
二个程序:视频 23
跳转 24
简单的变换 28
不那么简单的变换 30
从摄像头中读取 32
写入AVI文件 33
小结 34
练习 35
3章 了解OpenCV的数据类型 37
基础知识 37
OpenCV的数据类型 37
基础类型概述 38
深入了解基础类型 39
辅助对象 46
工具函数 53
模板结构 60
小结 61
练习 61
4章 图像和大型数组类型 63
动态可变的存储 63
cv::Mat类N维稠密数组 64
创建一个数组 65
独立获取数组元素 69
数组迭代器NAryMatIterator 72
通过块访问数组元素 74
矩阵表达式:代数和cv::Mat 75
饱和转换 77
数组还可以做很多事情 78
稀疏数据类cv::SparesMat 79
访问稀疏数组中的元素 79
稀疏数组中的特有函数 82
为大型数组准备的模板结构 83
小结 85
练习 86
5章 矩阵操作 87
矩阵还可以做更多事情 87
cv::abs() 90
cv::add() 91
cv::addWeighted() 92
cv::bitwise_and() 94
cv::bitwise_not() 94
cv::bitwise_or() 94
cv::bitwise_xor() 95
cv::calcCovarMatrix() 95
cv::cartToPolar() 97
cv::checkRange() 97
cv::compare() 98
cv::completeSymm() 99
cv::convertScaleAbs() 99
cv::countNonZero() 100
cv::Mat cv::cvarrToMat() 100
cv::dct() 101
cv::dft() 102
cv::cvtColor() 103
cv::determinant() 106
cv::divide() 106
cv::eigen() 106
cv::exp() 107
cv::extractImageCOI() 107
cv::flip() 108
cv::gemm() 108
cv::getConvertElem()和cv::getConvertScaleElem() 109
cv::idct() 110
cv::inRange() 110
cv::insertImageCOI() 111
cv::invert() 111
cv::log() 112
cv::LUT() 112
cv::Mahalanobis() 113
cv::max() 114
cv::mean() 115
cv::meanStdDev() 116
cv::merge() 116
cv::min() 116
cv::minMaxIdx() 117
cv::minMaxLoc() 118
cv::mixChannels() 119
cv::mulSpectrums() 120
cv::multiply() 121
cv::mulTransposed() 121
cv::norm() 122
cv::normalize() 123
cv::perspectiveTransform() 125
cv::phase() 125
cv::polarToCart() 126
cv::pow() 126
cv::randu() 127
cv::randn() 127
cv::repeat() 129
cv::scaleAdd() 129
cv::setIdentity() 130
cv::solve() 130
cv::solveCubic() 131
cv::solvePoly() 132
cv::sort() 132
cv::sortIdx() 133
cv::split() 133
cv::sqrt() 134
cv::subtract() 135
cv::sum() 135
cv::trace() 135
cv::transform() 136
cv::transpose() 136
小结137
练习137
6章 绘图和注释 139
绘图139
艺术线条和填充多边形 140
字体和文字 146
小结148
练习148
7章OpenCV中的函数子 151
操作对象 151
主成分分析(cv::PCA) 151
奇异值分解cv::SVD 154
随机数发生器cv::RNG 157
小结160
练习160
8章 图像、视频与数据文件 163
HighGUI模块:一个可移植的图形工具包163
图像文件的处理 164
图像的载入与保存 165
关于codecs的一些注释 167
图片的编码与解码 168
视频的处理 169
使用cv::VideoCapture对象读取视频流 169
使用cv::VideoWriter对象写入视频 175
数据存储 176
cv::FileStorage的写入 177
使用cv::FileStorage读取文件 179
cv::FileNode 180
小结183
练习183
9章 跨平台和Windows系统 187
基于Windows开发 187
HighGUI原生图形用户接口 188
通过Qt后端工作 199
综合OpenCV和全功能GUI工具包 209
小结222
练习222
10章 滤波与卷积 225
概览225
预备知识 225
滤波、核和卷积 225
边界外推和边界处理 227
阈值化操作 230
Otsu算法 233
自适应阈值 233
平滑235
简单模糊和方框型滤波器 236
中值滤波器 238
高斯滤波器 239
双边滤波器 240
导数和梯度 242
索贝尔导数 242
Scharr滤波器 244
拉普拉斯变换 245
图像形态学 246
膨胀和腐蚀 247
通用形态学函数 250
开操作和闭操作 251
形态学梯度 254
顶帽和黑帽 256
自定义核 258
用任意线性滤波器做卷积 259
用cv::filter2D()进行卷积 259
通过cv::sepFilter2D使用可分核 260
生成卷积核 260
小结262
练习262
11章 常见的图像变换 267
概览267
拉伸、收缩、扭曲和旋转 267
均匀调整 268
图像金字塔 269
不均匀映射 273
仿射变换 274
透视变换 279
通用变换 282
极坐标映射 282
LogPolar 283
任意映射 287
图像修复 287
图像修复 288
去噪 289
直方图均衡化 292
cv::equalizeHist()用于对比均衡 294
小结295
练习295
12章 图像分析 297
概览297
离散傅里叶变换 297
cv::dft()离散傅里叶变换 298
cv::idft()用于离散傅里叶逆变换 300
cv::mulSpectrums()频谱乘法 300
使用傅里叶变换进行卷积 301
cv::dct()离散余弦变换 303
cv::idct()离散余弦逆变换 304
积分图 304
cv::integral()标准求和积分 306
cv::integral()平方求和积分 306
cv::integral()倾斜求和积分 307
Canny边缘检测 307
cv::Canny() 309
Hough变换 309
Hough线变换 309
Hough圆变换 313
距离变换 316
cv::distanceTransform()无标记距离变换 317
cv::distanceTransform()有标记距离变换 317
分割318
漫水填充 318
分水岭算法 322
Grabcuts算法 323
Mean-Shift分割算法 325
小结326
练习326
13章 直方图和模板 329
OpenCV中直方图的表示 331
cv::calcHist():从数据创建直方图 332
基本直方图操作 334
直方图归一化 334
直方图二值化 335
找出显著的区间 335
比较两个直方图 337
直方图用法示例 339
一些复杂的直方图方法 342
EMD距离 342
反向投影 347
模板匹配 350
方差匹配方法(cv::TM_SQDIFF) 351
归一化方差匹配方法(cv::TM_SQDIFF_NORMED) 352
相关性匹配方法(cv::TM_CCORR)352
归一化的互相关匹配方法(cv::TM_CCORR_NORMED) 352
相关系数匹配方法(cv::TM_CCOEFF) 352
归一化的相关系数匹配方法(cv::TM_CCOEFF_NORMED) 352
小结355
练习355
14章 轮廓 359
轮廓查找 359
轮廓层次 360
绘制轮廓 364
轮廓实例 365
另一个轮廓实例 366
快速连通区域分析 368
深入分析轮廓 370
多边形逼近 370
几何及特性概括 372
几何学测试 377
匹配轮廓与图像 378
矩 378
再论矩 380
使用Hu矩进行匹配 383
利用形状场景方法比较轮廓 384
小结388
练习389
15章 背景提取 391
背景提取概述 391
背景提取的缺点 392
场景建模 392
像素 393
帧间差分 396
平均背景法 397
累计均值,方差和协方差 403
更复杂的背景提取方法 410
结构 413
进行背景学习 414
存在移动的前景物体时进行背景学习417
背景差分:检测前景物体 418
使用码书法的背景模型 419
关于码书法的其他想法 419
使用连通分量进行前景清理 420
小测试 423
两种背景方法的对比 425
OpenCV中的背景提取方法的封装 425
cv::BackgroundSubstractor基类 426
KB方法 427
Zivkovic方法 428
小结431
练习431
16章 关键点和描述子 433
关键点和跟踪基础 433
角点检测 434
光流简介 437
Lucas-Kanade稀疏光流法 438
广义关键点和描述符 448
光流,跟踪和识别 450
OpenCV一般如何处理关键点和描述符 451
核心关键点检测方法 461
关键点过滤 497
匹配方法 499
结果显示 505
小结508
练习508
17章 跟踪 511
跟踪中的概念 511
稠密光流 512
Farneback多项式扩展算法 513
Dual TV-L1模型 515
简单光流算法 519
Mean-Shift算法和Camshift追踪 522
Mean-Shift算法 522
Camshift 526
运动模板 526
估计533
卡尔曼滤波器 534
扩展卡尔曼滤波器简述 549
小结551
练习551
18章 相机模型与标定 553
相机模型 554
射影几何基础 556
Rodrigues变换 558
透镜畸变 559
标定562
旋转矩阵和平移向量 563
标定板 566
单应性 572
相机标定 576
矫正587
矫正映射 587
使用cv::convertMaps()在不同表示方式之间转换矫正映射 588
使用cv::initUndistortRectifyMap()计算矫正映射 589
使用cv::remap()矫正图像 591
使用cv::undistort()进行矫正 591
使用cv::undistortPoints()进行稀疏矫正 591
与标定结合 592
小结595