1. 程式人生 > >OpenCV3程式設計入門(毛星雲)pdf

OpenCV3程式設計入門(毛星雲)pdf

下載地址:網盤下載

內容提要 OpenCV在計算機視覺領域扮演著重要的角色。作為一個基於開源發行的跨平臺計算機視覺庫,OpenCV實現了影象處理和計算機視覺方面的很多通用演算法。《OpenCV3程式設計入門》以當前最新版本的OpenCV最常用最核心的元件模組為索引,深入淺出地介紹了OpenCV2和OpenCV3中的強大功能、效能,以及新特性。書本配套的OpenCV2和OpenCV3雙版本的示例程式碼包中,含有總計兩百多個詳細註釋的程式原始碼與思路說明。讀者可以按圖索驥,按技術方向進行快速上手和深入學習。 《OpenCV3程式設計入門》要求讀者具有基礎的C/C++知識,適合研究計算機視覺以及相關領域的在校學生和老師、初次接觸OpenCV但有一定C/C++程式設計基礎的研究人員,以及已有過OpenCV 1.0程式設計經驗,想快速瞭解並上手OpenCV2、OpenCV3程式設計的計算機視覺領域的專業人員。《OpenCV3程式設計入門》也適合於影象處理、計算機視覺領域的業餘愛好者、開源專案愛好者做為通向新版OpenCV的參考手冊之用。 《OpenCV3程式設計入門》配套的【示例程式】、【.exe可執行檔案】、【書內彩圖】的下載連結可通過掃描《OpenCV3程式設計入門》封底後勒口的二維碼獲取。 目錄 第一部分 快速上手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 第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 第二部分 初探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 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.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 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 作者簡介 毛星雲,90後,網路ID“淺墨”。微軟VC++領域最具價值專家(MVP),中國2013年度十大傑出IT部落格作者,南京航空航天大學2014年度十大傑出青年。CSDN部落格專家,2013年度CSDN部落格之星,於CSDN寫博數年,部落格瀏覽量已逾252萬人次。本科畢業於烏克蘭國立航空航天大學以及南京航空航天大學,碩士就讀於南京航空航天大學。已出版著作《逐夢旅程:Windows遊戲程式設計之從零開始》,個人事蹟曾多次被人民網、新華網、鳳凰網、網易新聞、新浪新聞、金陵晚報、現代快報等主流媒體報道。 前言 計算機視覺是一個近幾年來日臻成熟的領域。隨著運算效能強勁而又價格實惠的計算裝置的不斷問世,建立複雜的影象應用從未像今天這般容易。OpenCV在計算機視覺領域扮演著重要的角色,它是一個基於開源發行的跨平臺計算機視覺庫,實現了影象處理和計算機視覺方面的很多通用演算法。自1999年問世以來,OpenCV已經被計算機視覺領域的學者和開發者視為首選工具,併成為了計算機視覺領域最有力的研究工具之一。 OpenCV最初由Intel的一個小組進行開發。在一系列的beta版本後,OpenCV 1.0正式版本終於在2006年10月19日釋出。 2009年10月1日,OpenCV 2.0問世,它帶來了全新的C++介面,將OpenCV的能力無限放大。在2.0的時代,OpenCV增加了全新的平臺支援,包括iOS和Andriod,通過CUDA和OpenCL實現了GPU加速,為Python和Java使用者提供了介面,基於Github和Buildbot構建了充滿藝術感的持續整合的系統,所以才有了被全世界的很多公司和學校所採用的穩定易用的OpenCV 2.4.x。 2014年8月21日,OpenCV 3.0 Alpha釋出,它帶來了全新的專案架構的改變,宣告了計算機視覺新時代的來臨。和其他大型專案一樣,OpenCV3拋棄了整體統一架構,使用核心+外掛的架構形式,讓自身主體更加穩定,而附加的庫則可以更加靈活多變,以保持高速的發展與迭代。 本書源自於筆者在CSDN上連載的名為