1. 程式人生 > >OpenCV 學習筆記03 findContours函數

OpenCV 學習筆記03 findContours函數

組織 simple canny range lis 有用 tour 每一個 建議

1 函數釋義

詞義:發現輪廓!

從二進制圖像中查找輪廓(Finds contours in a binary image);輪廓是形狀分析和物體檢測和識別的有用工具。

findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy

參數

image - 一個8位單通道二值圖像(非0即1)。非零像素視為1、零像素依然為0, 因此圖像被視為二進制。也可使用compare()、inRange()、threshold()、adaptiveThreshold()、Canny()

等函數從灰度圖或彩色圖中創建二進制圖像。若 mode 等於 #RETR_CCOMP 或 #RETR_FLOODFILL,則輸入也可以是標簽的32位整數圖像(CV_32SC1)。

mode - 輪廓檢索模式

  • CV.RETR_EXTERNAL - 僅檢索外輪廓。並為所有輪廓設置層級結構,如 sets hierarchy[i][2]=hierarchy[i][3]=-1
  • CV.RETR_LIST - 檢索輪廓但不建立任何層次關系。
  • CV.RETR_CCOMP - 檢索所有輪廓並將它們組織成兩級層次結構。上面的一層為外邊界,裏面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。
  • CV.RETR_TREE - 檢索所有輪廓並建立等級樹結構的輪廓,具體演示參考contours.c這個demo

method - 輪廓近似方法

  • CV.CHAIN_APPROX_NONE - 存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1
  • CV.CHAIN_APPROX_SIMPLE - 壓縮水平、垂直、對角線方向的元素,僅留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息
  • CV.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS - 使用teh-Chinl 鏈式近似算法

offset - 每個輪廓點的偏移量。若從image ROI中提取輪廓,則應基於整個圖像進行分析

返回值

contours - 檢測到的輪廓,列表list形式,list 中每個元素都是圖像中的一個輪廓,這裏的每一個元素仍為(點)向量。

hierarchy - 它和輪廓 contours 個數相同(可選結果),這是一個 ndarray,其中元素個數和輪廓個數相同。每個輪廓 contours[i] 對應 4 個 hierarchy 元素 hierarchy[i][0] ~ hierarchy[i][3],分別表示後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數。(各個輪廓的繼承關系。hierarchy也是一個向量,長度和contours相等,每個元素和contours的元素對應。hierarchy的每個元素是一個包含四個整型數的向量)

註意:

Source image is modified by this function.

該函數會修改輸入的圖像,故建議使用原始圖像的副本,所以在代碼中常用 img.copy() 來作為輸入圖像。

2 示例

OpenCV 學習筆記03 findContours函數