OpenCV-Python 中文教程(搬运)目录
OpenCV-Python 中文教程
OpenCV官方教程中文版(For Python)
OpenCV2-Python-Tutorials
段力辉 译
说明:搬运自linux公社pdf文件,粗略搬运,仅作个人笔记参考,有时间再美化
部分文件参考:
https://github.com/abidrahmank/OpenCV2-Python-Tutorials
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
索引目录
说明:搬运自linux公社pdf文件,粗略搬运,仅作个人笔记参考,有时间再美化
部分文件参考:
https://github.com/abidrahmank/OpenCV2-Python-Tutorials
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
详细目录(译者说明附在末尾)
I 走进 OpenCV 10
1 关于 OpenCV-Python 教程 10
2 在 在 Windows 上安装 OpenCV-Python 11
3 在 在 Fedora 上安装 OpenCV-Python 12
II OpenCV 中的 Gui 特性 13
4 图片 13
4.1 读入图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2 显示图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.3 保存图像 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.4 总结一下 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5 视频 18
5.1 用摄像头捕获视频 . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2 从文件中播放视频 . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.3 保存视频 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6 OpenCV 中的绘图函数 24
6.1 画线 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2 画矩形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.3 画圆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.4 画椭圆 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.5 画多边形 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.6 在图片上添加文字 . . . . . . . . . . . . . . . . . . . . . . . . . 26
7 把鼠标当画笔 28
7.1 简单演示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.2 高级一点的示例 . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8 用滑动条做调色板 32
8.1 代码示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
III 核心操作 36
9 图像的基础操作 36
9.1 获取并修改像素值 . . . . . . . . . . . . . . . . . . . . . . . . . 36
9.2 获取图像属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
9.3 图像 ROI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
9.4 拆分及合并图像通道 . . . . . . . . . . . . . . . . . . . . . . . . 40
9.5 为图像扩边(填充) . . . . . . . . . . . . . . . . . . . . . . . . 41
10 图像上的算术运算 43
10.1图像加法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.2图像混合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.3按位运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
11 程序性能检测及优化 47
11.1使用 OpenCV 检测程序效率 . . . . . . . . . . . . . . . . . . . 47
11.2OpenCV 中的默认优化 . . . . . . . . . . . . . . . . . . . . . . 48
11.3在 IPython 中检测程序效率 . . . . . . . . . . . . . . . . . . . 49
11.4更多 IPython 的魔法命令 . . . . . . . . . . . . . . . . . . . . . 51
11.5效率优化技术 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
12OpenCV 中的数学工具 53
IV OpenCV 中的图像处理 54
13 颜色空间转换 54
13.1转换颜色空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
13.2物体跟踪 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
13.3怎样找到要跟踪对象的 HSV 值? . . . . . . . . . . . . . . . . . 57
14 几何变换 59
14.1扩展缩放 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
14.2平移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
14.3旋转 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
14.4仿射变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
14.5透视变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
15 图像阈值 66
15.1简单阈值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
15.2自适应阈值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
15.3Otsu’s 二值化 . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
15.4Otsu’s 二值化是如何工作的? . . . . . . . . . . . . . . . . . . 72
16 图像平滑 75
16.1平均 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
16.2高斯模糊 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
16.3中值模糊 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
16.4双边滤波 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
17 形态学转换 81
17.1腐蚀 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
17.2膨胀 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
17.3开运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
17.4闭运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
17.5形态学梯度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
17.6礼帽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
17.7黑帽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
17.8形态学操作之间的关系 . . . . . . . . . . . . . . . . . . . . . . . 84
18 图像梯度 87
18.1Sobel 算子和 Scharr 算子 . . . . . . . . . . . . . . . . . . . . 87
18.2Laplacian 算子 . . . . . . . . . . . . . . . . . . . . . . . . . . 87
19Canny 边缘检测 91
19.1原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
19.1.1噪声去除 . . . . . . . . . . . . . . . . . . . . . . . . . . 91
19.1.2计算图像梯度 . . . . . . . . . . . . . . . . . . . . . . . . 91
19.1.3非极大值抑制 . . . . . . . . . . . . . . . . . . . . . . . . 91
19.1.4滞后阈值 . . . . . . . . . . . . . . . . . . . . . . . . . . 92
19.2OpenCV 中的 Canny 边界检测 . . . . . . . . . . . . . . . . . 92
20 图像金字塔 94
20.1原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
20.2使用金字塔进行图像融合 . . . . . . . . . . . . . . . . . . . . . 96
21OpenCV 中的轮廓 101
21.1初识轮廓 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
21.1.1什么是轮廓 . . . . . . . . . . . . . . . . . . . . . . . . . 101
21.1.2怎样绘制轮廓 . . . . . . . . . . . . . . . . . . . . . . . . 101
21.1.3轮廓的近似方法 . . . . . . . . . . . . . . . . . . . . . . 102
21.2轮廓特征 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
21.2.1矩 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
21.2.2轮廓面积 . . . . . . . . . . . . . . . . . . . . . . . . . . 104
21.2.3轮廓周长 . . . . . . . . . . . . . . . . . . . . . . . . . . 105
21.2.4轮廓近似 . . . . . . . . . . . . . . . . . . . . . . . . . . 105
21.2.5凸包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
21.2.6凸性检测 . . . . . . . . . . . . . . . . . . . . . . . . . . 107
21.2.7边界矩形 . . . . . . . . . . . . . . . . . . . . . . . . . . 107
21.2.8最小外接圆 . . . . . . . . . . . . . . . . . . . . . . . . . 108
21.2.9椭圆拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . 109
21.2.10 直线拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . 109
21.3轮廓的性质 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
21.3.1长宽比 . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
21.3.2Extent . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
21.3.3Solidity . . . . . . . . . . . . . . . . . . . . . . . . . . 111
21.3.4Equivalent Diameter . . . . . . . . . . . . . . . . . . 112
21.3.5方向 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
21.3.6掩模和像素点 . . . . . . . . . . . . . . . . . . . . . . . . 112
21.3.7最大值和最小值及它们的位置 . . . . . . . . . . . . . . . 113
21.3.8平均颜色及平均灰度 . . . . . . . . . . . . . . . . . . . . 113
21.3.9极点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
21.4轮廓:更多函数 . . . . . . . . . . . . . . . . . . . . . . . . . . 115
21.4.1凸缺陷 . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
21.4.2Point Polygon Test . . . . . . . . . . . . . . . . . . . . 116
21.4.3形状匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . 117
21.5轮廓的层次结构 . . . . . . . . . . . . . . . . . . . . . . . . . . 119
21.5.1什么是层次结构 . . . . . . . . . . . . . . . . . . . . . . 119
21.5.2OpenCV 中层次结构 . . . . . . . . . . . . . . . . . . . 120
21.5.3轮廓检索模式 . . . . . . . . . . . . . . . . . . . . . . . . 120
22 直方图 124
22.1直方图的计算,绘制与分析 . . . . . . . . . . . . . . . . . . . . 124
22.1.1统计直方图 . . . . . . . . . . . . . . . . . . . . . . . . . 124
22.1.2绘制直方图 . . . . . . . . . . . . . . . . . . . . . . . . . 126
22.1.3使用掩模 . . . . . . . . . . . . . . . . . . . . . . . . . . 128
22.2直方图均衡化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
22.2.1OpenCV 中的直方图均衡化 . . . . . . . . . . . . . . . . 132
22.2.2CLAHE 有限对比适应性直方图均衡化 . . . . . . . . . . 132
22.32D 直方图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
22.3.1介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
22.3.2OpenCV 中的 2D 直方图 . . . . . . . . . . . . . . . . . 135
22.3.3Numpy 中 2D 直方图 . . . . . . . . . . . . . . . . . . . 136
22.3.4绘制 2D 直方图 . . . . . . . . . . . . . . . . . . . . . . 136
22.4直方图反向投影 . . . . . . . . . . . . . . . . . . . . . . . . . . 141
22.4.1Numpy 中的算法 . . . . . . . . . . . . . . . . . . . . . 141
22.4.2OpenCV 中的反向投影 . . . . . . . . . . . . . . . . . . 143
23 图像变换 146
23.1傅里叶变换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
23.1.1Numpy 中的傅里叶变换 . . . . . . . . . . . . . . . . . . 146
23.1.2OpenCV 中的傅里叶变换 . . . . . . . . . . . . . . . . . 148
23.1.3DFT 的性能优化 . . . . . . . . . . . . . . . . . . . . . . 150
23.1.4为什么拉普拉斯算子是高通滤波器? . . . . . . . . . . . 152
24 模板匹配 155
24.1OpenCV 中的模板匹配 . . . . . . . . . . . . . . . . . . . . . . 155
24.2多对象的模板匹配 . . . . . . . . . . . . . . . . . . . . . . . . . 158
25Hough 直线变换 160
25.1OpenCV 中的霍夫变换 . . . . . . . . . . . . . . . . . . . . . . 161
25.2Probabilistic Hough Transform . . . . . . . . . . . . . . . . 163
26Hough 圆环变换 165
27 分水岭算法图像分割 168
27.1代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
28 使用 GrabCut 算法进行交互式前景提取 173
28.1演示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
V 图像特征提取与描述 178
29 理解图像特征 178
29.1解释 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
30Harris 角点检测 181
30.1OpenCV 中的 Harris 角点检测 . . . . . . . . . . . . . . . . . 182
30.2亚像素级精确度的角点 . . . . . . . . . . . . . . . . . . . . . . . 184
31Shi-Tomasi 角点检测 & 适合于跟踪的图像特征 187
31.1代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
32 介绍 SIFT(Scale-Invariant Feature Transform) 190
33 介绍 SURF(Speeded-Up Robust Features) 195
33.1OpenCV 中的 SURF . . . . . . . . . . . . . . . . . . . . . . . 197
34 角点检测的 FAST 算法 200
34.1使用 FAST 算法进行特征提取 . . . . . . . . . . . . . . . . . . . 200
34.2机器学习的角点检测器 . . . . . . . . . . . . . . . . . . . . . . . 201
34.3非极大值抑制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
34.4总结 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
34.5OpenCV 中 FAST 特征检测器 . . . . . . . . . . . . . . . . . . 202
35BRIEF(Binary Robust Independent Elementary Features) 205
35.1OpenCV 中的 BRIEF . . . . . . . . . . . . . . . . . . . . . . 205
36ORB (Oriented FAST and Rotated BRIEF) 207
36.1OpenCV 中的 ORB 算法 . . . . . . . . . . . . . . . . . . . . . 208
37 特征匹配 211
37.1Brute-Force 匹配的基础 . . . . . . . . . . . . . . . . . . . . . 211
37.2对 ORB 描述符进行蛮力匹配 . . . . . . . . . . . . . . . . . . . 212
37.3匹配器对象是什么? . . . . . . . . . . . . . . . . . . . . . . . . 213
37.4对 SIFT 描述符进行蛮力匹配和比值测试 . . . . . . . . . . . . . 213
37.5FLANN 匹配器 . . . . . . . . . . . . . . . . . . . . . . . . . . 214
38 使用特征匹配和单应性查找对象 218
38.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
38.2代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
VI 视频分析 222
39Meanshift 和 和 Camshift 222
39.1Meanshift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
39.2OpenCV 中的 Meanshift . . . . . . . . . . . . . . . . . . . . 223
39.3Camshift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
39.4OpenCV 中的 Camshift . . . . . . . . . . . . . . . . . . . . . 226
40 光流 231
40.1光流 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
40.2Lucas-Kanade 法 . . . . . . . . . . . . . . . . . . . . . . . . . 232
40.3OpenCV 中的 Lucas-Kanade 光流 . . . . . . . . . . . . . . . 232
40.4OpenCV 中的稠密光流 . . . . . . . . . . . . . . . . . . . . . . 235
41 背景减除 238
41.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
41.2BackgroundSubtractorMOG . . . . . . . . . . . . . . . . . 238
41.3BackgroundSubtractorMOG2 . . . . . . . . . . . . . . . . . 239
41.4BackgroundSubtractorGMG . . . . . . . . . . . . . . . . . 240
41.5结果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
VII 摄像机标定和 3D 重构 243
42 摄像机标定 243
42.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
42.2代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
42.2.1设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
42.2.2标定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
42.2.3畸变校正 . . . . . . . . . . . . . . . . . . . . . . . . . . 247
42.3反向投影误差 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
43 姿势估计 250
43.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
43.1.1渲染一个立方体 . . . . . . . . . . . . . . . . . . . . . . 252
44 对极几何(Epipolar Geometry ) 254
44.1基本概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
44.2代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
45 立体图像中的深度地图 259
45.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
45.2代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
VIII 机器学习 261
46K 近邻(k-Nearest Neighbour ) 261
46.1理解 K 近邻 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
46.1.1OpenCV 中的 kNN . . . . . . . . . . . . . . . . . . . . 262
46.2使用 kNN 对手写数字 OCR . . . . . . . . . . . . . . . . . . . 266
46.2.1手写数字的 OCR . . . . . . . . . . . . . . . . . . . . . . 266
46.2.2英文字母的 OCR . . . . . . . . . . . . . . . . . . . . . . 268
47 支持向量机 270
47.1理解 SVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
47.1.1线性数据分割 . . . . . . . . . . . . . . . . . . . . . . . . 270
47.1.2非线性数据分割 . . . . . . . . . . . . . . . . . . . . . . 271
47.2使用 SVM 进行手写数据 OCR . . . . . . . . . . . . . . . . . . 273
48K 值聚类 277
48.1理解 K 值聚类 . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
48.1.1T 恤大小问题 . . . . . . . . . . . . . . . . . . . . . . . . 277
48.1.2它是如何工作的? . . . . . . . . . . . . . . . . . . . . . 278
48.2OpenCV 中的 K 值聚类 . . . . . . . . . . . . . . . . . . . . . . 281
48.2.1理解函数的参数 . . . . . . . . . . . . . . . . . . . . . . 281
48.2.2仅有一个特征的数据 . . . . . . . . . . . . . . . . . . . . 282
48.2.3颜色量化 . . . . . . . . . . . . . . . . . . . . . . . . . . 286
IX 计算摄影学 288
49 图像去噪 288
49.1OpenCV 中的图像去噪 . . . . . . . . . . . . . . . . . . . . . . 289
49.1.1cv2.fastNlMeansDenoisingColored() . . . . . . . . 290
49.1.2cv2.fastNlMeansDenoisingMulti() . . . . . . . . . . 290
50 图像修补 294
50.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
50.2代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
X 对象检测 297
51 使用 Haar 分类器进行面部检测 297
51.1基础 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
51.2OpenCV 中的 Haar 级联检测 . . . . . . . . . . . . . . . . . . 299
为什么翻译此书?
段力辉
1 为什么使用 Python
Python 作为一种高效简洁的直译式语言非常适合我们用来解决日常工作的问题。而且它简单易学,初学者几个小时就可以基本入门。再加上 Numpy 和 matplotlib 这两个翅膀,Python 对数据分析的能力不逊于Matlab。Python 还被称为是胶水语言,有很多软件都提供了 Python 接口。尤其是在 linux 下,可以使用 Python 将不同的软件组成一个工作流,发挥每一个软件自己最大的优势从而完成一个复杂的任务。比如我们可以使用 Mysql 存储数据,使用 R 分析数据,使用 matplotlib 展示数据,使用OpenGL 进行 3D 建模,使用 Qt 构建漂亮的 GUI。而 Python 可以将他们联合在一起构建一个强大的工作流。
2 为什么使用 Python-OpenCV
虽然 python 很强大,而且也有自己的图像处理库 PIL,但是相对于OpenCV 来讲,它还是弱小很多。跟很多开源软件一样 OpenCV 也提供了完善的 python 接口,非常便于调用。OpenCV 的稳定版是 2.4.8,最新版是 3.0,包含了超过 2500 个算法和函数,几乎任何一个能想到的成熟算法都可以通过调用 OpenCV 的函数来实现,超级方便。
3 为什么是这本书
但是非常可惜关于在 Python 下使用 OpenCV 的书,除了这本在线教程之外,仅有一个 100 多页的书 opencv computer vision with python(本书虽然挺好的,但是不够全面,不能让读者完全了解 opencv 的现状)。而我翻译的这本书是来源于 OpenCV 的官方文档,内容全面,对各种的算法的描述简单易懂,而且不拘泥于长篇大论的数学推导,非常适合想使用OpenCV 解决实际问题的人,对他们来说具体的数学原理并不重要,重要是能解决实际问题。
在国内这本书可以说是第一本 Python_OpenCV 的译作。
4 本书的时效性
本书的编写时针对最新的 OpenCV3.0 的,本版本还没有正式发布(但很稳定),其中的内容页非常新,甚至用到了 2012 年才提出的算法。因此本书的时效性上应该是没有问题的。
5 本书的目标读者
本书针的读者是高校学生,科研工作者,图像处理爱好者。对于这些人群,他们往往是带着具体的问题,在苦苦寻找解决方案。为了一个小问题就让他们去学习 C++ 这么深奥的语言几乎是不可能的。而 Python 的悄然兴起给他们带来的希望,如果说 C++ 是 tex 的话,那 Python 的易用性相当于 word。他们可以很快的看懂本书的所有代码,并可以学着使用它们来解决自己的问题,同时也能拓展自己的视野。别人经常说 Python 不够快,但是对于上面的这些读者,我相信这不是问题,现在我们日常使用的PC 机已经无比强大了,而且绝大多数情况下不会用到实时处理,更不会在嵌入式设备上使用。因此这不是问题。
OpenCV-Python
段力辉
2014 年 1 月 30 日