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