難以置信!一篇文章就梳理清楚了 Python OpenCV 的知識體系

2021-04-06 23:00:01

橡皮擦,一個逗趣的網際網路高階網蟲。

觀前提醒,本篇文章涉及知識點巨大,建議先收藏,再慢慢學習。

本篇文章目的將為你詳細羅列 Python OpenCV 的學習路線與重要知識點。核心分成 24 個小節點,全部掌握,OpenCV 入門階段就順利通過了。

1. OpenCV 初識與安裝

本部分要了解 OpenCV (Open Source Computer Vision Library)的相關簡介,OpenCv 可以執行在多平臺之上,輕量級而且高效,由一系列 C 函數和少量 C++類構成,提供了 Python、Ruby、MATLAB 等語言的介面,所以在學習的時候,要注意查閱資料的語言實現相關問題。

這個階段除了安裝 OpenCV 相關庫以外,建議收藏官方網址,官方手冊,官方入門教學,這些都是最佳的學習資料。

模組安裝完畢,需要重點測試 OpenCV 是否安裝成功,可通過 Python 查詢安裝版本。

2. OpenCV 模組簡介

先從全域性上掌握 OpenCV 都由哪些模組組成。例如下面這些模組,你需要找到下述模組的應用場景與簡介。

coreimgprochighguicalib3dfeatures2dcontribflanngpulegacymlobjdetectphotostitching

整理每個模組的核心功能,並完成第一個 OpenCV 案例,讀取顯示圖片。

3. OpenCV 影象讀取,顯示,儲存

安裝 OpenCV 之後,從影象獲取開始進行學習,包含本地載入圖片,相機獲取圖片,視訊獲取,建立影象等內容。

只有先獲取影象之後,才能對影象進行操作處理,資訊提取,結果輸出,影象顯示影象儲存

對於一個影象而言,在 OpenCV 中進行讀取展示的步驟如下,你可以將其程式碼進行對應。

  1. 影象讀取;
  2. 視窗建立;
  3. 影象顯示;
  4. 影象儲存;
  5. 資源釋放。

涉及需要學習的函數有 cv2.imread()cv2.namedWindow()cv2.imshow()cv2.imwrite()cv2.destroyWindow()cv2.destroyAllWindows()cv2.imshow()cv2.cvtColor()cv2.imwrite()cv2.waitKey()

4. 攝像頭和視訊讀取,儲存

第一個要重點學習 VideoCapture 類,該類常用的方法有:

  • open() 函數;
  • isOpened() 函數;
  • release() 函數;
  • grab() 函數;
  • retrieve() 函數;
  • get() 函數;
  • set() 函數;

除了讀取視訊外,還需要掌握 Opencv 提供的 VideoWriter 類,用於儲存視訊檔。

學習完相關知識之後,可以進行這樣一個實驗,將一個視訊逐幀儲存為圖片。

5. OpenCV 常用資料結構和顏色空間

這部分要掌握的類有 Point 類、Rect 類、Size 類、Scalar 類,除此之外,在 Python 中用 numpy 對影象進行操作,所以 numpy 相關的知識點,建議提前學習,效果更佳。

OpenCV 中常用的顏色空間有 BGR 顏色空間、HSV/HLS 顏色空間、Lab 顏色空間,這些都需要了解,優先掌握 BGR 顏色空間。

6. OpenCV 常用繪圖函數

掌握如下函數的用法,即可熟練的在 Opencv 中繪製圖形。

  • cv2.line();
  • cv2.circle();
  • cv2.rectangle();
  • cv2.ellipse();
  • cv2.fillPoly();
  • cv2.polylines();
  • cv2.putText()。

7. OpenCV 介面事件操作之滑鼠與滑動條

第一個要掌握的函數是滑鼠操作訊息回撥函數,cv2.setMouseCallback() ,滑動條涉及兩個函數,分別是:cv2.createTrackbar()cv2.getTrackbarPos()

掌握上述內容之後,可以實現兩個案例,其一為滑鼠在一張圖片上拖動框選區域進行截圖,其二是通過滑動條讓視訊倍速播放。

8. 影象畫素、通道分離與合併

瞭解影象畫素矩陣,熟悉圖片的畫素構成,可以存取指定畫素的畫素值,並對其進行修改。

通道分離函數 cv2.split(),通道合併函數 cv2.merge()

9. 影象邏輯運算

掌握影象之間的計算,涉及函數如下:

  • cv2.add();
  • cv2.addWeighted();
  • cv2.subtract();
  • cv2.absdiff();
  • cv2.bitwise_and();
  • cv2.bitwise_not();
  • cv2.bitwise_xor()。

還可以研究影象乘除法。

10. 影象 ROI 與 mask 掩膜

本部分屬於 OpenCV 中的重點知識,第一個為感興趣區域 ROI,第二個是 mask 掩膜(掩碼)操作 。

學習 ROI 部分時,還可以學習一下影象的深淺拷貝。

11. 影象幾何變換

影象幾何變換依舊是對基礎函數的學習與理解,涉及內容如下:

  • 影象縮放 cv2.resize();
  • 影象平移 cv2.warpAffine();
  • 影象旋轉 cv2.getRotationMatrix2D();
  • 影象轉置 cv2.transpose();
  • 影象映象 cv2.flip();
  • 影象重對映 cv2.remap()。

12. 影象濾波

理解什麼是濾波,高頻與低頻濾波,影象濾波函數。

線性濾波:方框濾波、均值濾波、高斯濾波,
非線性濾波:中值濾波、雙邊濾波,

  • 方框濾波 cv2.boxFilter();
  • 均值濾波 cv2.blur();
  • 高斯濾波 cv2.GaussianBlur();
  • 中值濾波 cv2.medianBlur();
  • 雙邊濾波 cv2.bilateralFilter()。

13. 影象固定閾值與自適應閾值

影象閾值化是影象處理的重要基礎部分,應用很廣泛,可以根據灰度差異來分割影象不同部分,閾值化處理的影象一般為單通道影象(灰度圖),核心要掌握的兩個函數:

  • 固定閾值:cv2.threshold();
  • 自適應閾值:cv2.adaptiveThreshold()。

14. 影象膨脹腐蝕

膨脹、腐蝕屬於形態學的操作,是影象基於形狀的一系列影象處理操作。
膨脹腐蝕是基於高亮部分(白色)操作的,膨脹是対高亮部分進行膨脹,類似「領域擴張」, 腐蝕是高亮部分被腐蝕,類似「領域被蠶食」。

膨脹腐蝕的應用和功能:

  • 消除噪聲;
  • 分割獨立元素或連線相鄰元素;
  • 尋找影象中的明顯極大值、極小值區域;
  • 求影象的梯度;

核心需要掌握的函數如下:

  • 膨脹 cv2.dilate();
  • 腐蝕 cv2.erode()。

形態學其他操作,開運算閉運算頂帽黑帽形態學梯度 這些都是基於膨脹腐蝕基礎之上,利用 cv2.morphologyEx() 函數進行操作。

15. 邊緣檢測

邊緣檢測可以提取影象重要輪廓資訊,減少影象內容,可用於分割影象、特徵提取等操作。

邊緣檢測的一般步驟:

  • 濾波: 濾出噪聲対檢測邊緣的影響 ;
  • 增強: 可以將畫素鄰域強度變化凸顯出來—梯度運算元 ;
  • 檢測: 閾值方法確定邊緣 ;

常用邊緣檢測運算元:

  • Canny 運算元,Canny 邊緣檢測函數 cv2.Canny();
  • Sobel 運算元,Sobel 邊緣檢測函數 cv2.Sobel();
  • Scharr 運算元,Scharr 邊緣檢測函數 cv2.Scahrr() ;
  • Laplacian 運算元,Laplacian 邊緣檢測函數 cv2.Laplacian()。

16. 霍夫變換

霍夫變換(Hough Transform)是影象處理中的一種特徵提取技術,該過程在一個引數空間中,通過計算累計結果的區域性最大值,得到一個符合該特定形狀的集合,作為霍夫變換的結果。

本部分要學習的函數:

  • 標準霍夫變換、多尺度霍夫變換 cv2.HoughLines() ;
  • 累計概率霍夫變換 cv2.HoughLinesP() ;
  • 霍夫圓變換 cv2.HoughCricles() 。

17. 影象直方圖計算及繪製

先掌握直方圖相關概念,在掌握核心函數,最後通過 matplotlib 模組對直方圖進行繪製。計算直方圖用到的函數是 cv2.calcHist()

直方圖相關應用:

  • 直方圖均衡化 cv2.equalizeHist();
  • 直方圖對比 cv2.compareHist();
  • 反向投影 cv2.calcBackProject()。

18. 模板匹配

模板匹配是在一幅影象中尋找與另一幅模板影象最匹配(相似)部分的技術。

核心用到的函數如下:

  • 模板匹配 cv2.matchTemplate();
  • 矩陣歸一化 cv2.normalize();
  • 尋找最值 cv2.minMaxLoc()。

19. 輪廓查詢與繪製

核心要理解到在 OpenCV 中,查詢輪廓就像在黑色背景中找白色物體。

常用函數:

  • 查詢輪廓 cv2.findContours();
  • 繪製輪廓 cv2.drawContours() 。

最後應該掌握針對每個輪廓進行操作。

20. 輪廓特徵屬性及應用

這部分內容比較重要,並且知識點比較多,核心內容與函數分別如下:

  • 尋找凸包 cv2.convexHull() 與 凸性檢測 cv2.isContourConvex();
  • 輪廓外接矩形 cv2.boundingRect();
  • 輪廓最小外接矩形 cv2.minAreaRect();
  • 輪廓最小外接圓 cv2.minEnclosingCircle();
  • 輪廓橢圓擬合 cv2.fitEllipse();
  • 逼近多邊形曲線 cv2.approxPolyDP();
  • 計算輪廓面積 cv2.contourArea();
  • 計算輪廓長度 cv2.arcLength();
  • 計算點與輪廓的距離及位置關係 cv2.pointPolygonTest();
  • 形狀匹配 cv2.matchShapes()。

21. 高階部分-分水嶺演演算法及影象修補

掌握分水嶺演演算法的原理,掌握核心函數 cv2.watershed()

可以擴充套件補充影象修補技術及相關函數 cv2.inpaint(),學習完畢可以嘗試人像祛斑應用。

22. GrabCut & FloodFill 影象分割、角點檢測

這部分內容都需要一些影象專業背景知識,先掌握相關概念知識,在重點學習相關函數。

  • GrabCut 演演算法 cv2.grabCut();
  • 漫水填充演演算法 cv2.floodFill();
  • Harris 角點檢測 cv2.cornerHarris();
  • Shi-Tomasi 角點檢測 cv2.goodFeaturesToTrack();
  • 亞畫素角點檢測 cv2.cornerSubPix()。

23. 特徵檢測與匹配

特徵點的檢測和匹配是計算機視覺中非常重要的技術之一, 在物體識別、視覺跟蹤、三維重建等領域都有很廣泛的應用。

OpenCV 提供瞭如下特徵檢測方法:

  • 「FAST」 FastFeatureDetector;
  • 「STAR」 StarFeatureDetector;
  • 「SIFT」 SIFT(nonfree module) Opencv3 移除,需呼叫 xfeature2d 庫;
  • 「SURF」 SURF(nonfree module) Opencv3 移除,需呼叫 xfeature2d 庫;
  • 「ORB」 ORB Opencv3 移除,需呼叫 xfeature2d 庫;
  • 「MSER」 MSER;
  • 「GFTT」 GoodFeaturesToTrackDetector;
  • 「HARRIS」 (配合 Harris detector);
  • 「Dense」 DenseFeatureDetector;
  • 「SimpleBlob」 SimpleBlobDetector。

24. OpenCV 應用部分之運動物體跟蹤與臉部辨識

瞭解何為運動物體檢測,OpenCV 中常用的運動物體檢測方法有背景減法幀差法光流法,跟蹤演演算法常用的有 meanShiftcamShift粒子濾波光流法 等。

  • meanShift 跟蹤演演算法 cv2.meanShift();
  • CamShift 跟蹤演演算法 cv2.CamShift()。

如果學習臉部辨識,涉及的知識點為:

  • 人臉檢測:從影象中找出人臉位置並標識;
  • 臉部辨識:從定位到的人臉區域區分出人的姓名或其它資訊;
  • 機器學習。

相關閱讀

  1. Python 爬蟲 100 例教學,超棒的爬蟲教學,立即訂閱吧
  2. Python 遊戲世界(更新中,目標文章數 50+,現在訂閱,都是老粉)
  3. Python 爬蟲小課,精彩 9 講

今天是持續寫作的第 125 / 200 天。
如果你想跟博主建立親密關係,可以關注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的網際網路高階網蟲。
博主 ID:夢想橡皮擦,希望大家點贊評論收藏