1. 程式人生 > >【OpenCV3影象處理】查詢二值影象的邊緣 ( findContours()函式詳解 )

【OpenCV3影象處理】查詢二值影象的邊緣 ( findContours()函式詳解 )

void cv::findContours   (   
InputOutputArray    image,
OutputArrayOfArrays     contours,
OutputArray     hierarchy,
int     mode,
int     method,
Point   offset = Point() 
)       

第一個引數:
image,單通道影象矩陣,可以是灰度圖,但更常用的是二值影象,一般是經過Canny、拉普拉斯等邊緣檢測運算元處理過的二值影象;

第二個引數:
contours是一個向量,並且是一個雙重向量,向量內每個元素儲存了一組由連續的Point點構成的點的集合的向量,每一組Point點集就是一個輪廓。有多少輪廓,向量contours就有多少元素。

第三個引數:
hierarchy也是一個向量,向量內每個元素儲存了一個包含4個int整型的陣列。向量hiararchy內的元素和輪廓向量contours內的元素是一一對應的,向量的容量相同。hierarchy向量內每一個元素的4個int型變數——hierarchy[i][0] ~hierarchy[i][3],分別表示第i個輪廓的後一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號。如果當前輪廓沒有對應的後一個輪廓、前一個輪廓、父輪廓或內嵌輪廓的話,則hierarchy[i][0] ~hierarchy[i][3]的相應位被設定為 預設值-1。

第四個引數:
int型的mode,定義輪廓的檢索模式:

取值一:CV_RETR_EXTERNAL只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略

取值二:CV_RETR_LIST 檢測所有的輪廓,包括內圍、外圍輪廓,但是檢測到的輪廓不建立等級關
系,彼此之間獨立,沒有等級關係,這就意味著這個檢索模式下不存在父輪廓或內嵌輪廓,
所以hierarchy向量內所有元素的第3、第4個分量都會被置為-1,具體下文會講到

取值三:CV_RETR_CCOMP 檢測所有的輪廓,但所有輪廓只建立兩個等級關係,外圍為頂層,若外圍
內的內圍輪廓還包含了其他的輪廓資訊,則內圍內的所有輪廓均歸屬於頂層

取值四:CV_RETR_TREE, 檢測所有輪廓,所有輪廓建立一個等級樹結構。外層輪廓包含內層輪廓,內
層輪廓還可以繼續包含內嵌輪廓。

第五個引數:
int型的method,定義輪廓的近似方法:

取值一:CV_CHAIN_APPROX_NONE 儲存物體邊界上所有連續的輪廓點到contours向量內

取值二:CV_CHAIN_APPROX_SIMPLE 僅儲存輪廓的拐點資訊,把所有輪廓拐點處的點儲存入contours
向量內,拐點與拐點之間直線段上的資訊點不予保留

取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似演算法

第六個引數:
Point偏移量,所有的輪廓資訊相對於原始影象對應點的偏移量,相當於在每一個檢測出的輪廓 點上加上該偏移量,並且Point還可以是負值!

OpenCV提取輪廓之後,後處理函式:

ArcLength() 計算輪廓長度
ContourArea() 計算輪廓區域的面積
BoundingRect() 輪廓的外包矩形
ConvexHull() 提取輪廓的凸包
IsContourConvex() 測試輪廓的凸性
MinAreaRect() 輪廓的最小外包矩形
MinEnclosingCircle() 輪廓的最小外包圓