1. 程式人生 > >0034-使用OpenCV的函式findContours提取輪廓並繪製輪廓

0034-使用OpenCV的函式findContours提取輪廓並繪製輪廓

OpenCV裡提取目標輪廓的函式是findContours,它的輸入影象是一幅二值影象,輸出的是每一個連通區域的輪廓點的集合。

下面介紹相關函式的用法
findContours函式:
原型如下
C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())
引數意義如下


image:源影象,8位的單通道二值影象。
contours:檢測到的輪廓。每個輪廓都存儲存為一組點向量。
hierarchy:可選輸出引數。它記錄著影象的拓撲結構資訊。有多少個輪廓這個引數就有多少個元素。對於第i個輪廓,hierarchy[i][0]表示下一個輪廓;hiearchy[i][1]表示前一個輪廓 , hiearchy[i][2]表示第一個子輪廓 , hiearchy[i][3] 表示第一個父輪廓。如果沒有相應的輪廓,則值為負。
mode:拓樸檢測模式,有以下可選引數:
  CV_RETR_EXTERNAL:只返回外輪廓。這種模式下沒有子輪廓和父輪廓了。
  CV_RETR_LIST
:返回所有的輪廓。但是不建立輪廓的拓撲關係,所以hierarchical為空。
  CV_RETR_CCOMP:返回所有的輪廓,而且把這些輪廓分為兩層拓撲結構。第一層,是所有物體的外邊界。第二層,是所有洞(hole)的邊界。如果洞(hole)中還有其它連通的物體,那麼這個物體也被劃分到第一層中。
  CV_RETR_TREE:返回所有的輪廓,並且建立完整的拓撲結構。
method:輪廓近似方法,有以下可選引數:
  CV_CHAIN_APPROX_NONE:儲存所有的輪廓點。這種方法下,兩個連續的輪廓點,滿足max(abs(x1-x2),abs(y2-y1))==1. 
  CV_CHAIN_APPROX_SIMPLE
:壓縮掉輪廓的中間點。比如說一個矩形只需要知道四個端點即可。
  CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用eh-Chin chain approximation 演算法!
offset:這個引數用來設定輪廓偏移值。

drawContours函式:
這個函式用來繪製輪廓或填充輪廓
原型如下
C++: void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=LINE_8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
引數意義如下
image:目標影象。
contours: 待畫圖的輪廓,每個輪廓被儲存為一個向量。
contourIdx:指定哪些輪廓需要被繪製。如果這個值為負,則表示所有的輪廓都需要繪製。
color:輪廓顏色。
thickness:輪廓線寬。
lineType:線型別。
hierarchy:可選引數,表示輪廓的拓撲結構。
maxLevel:在引數hierarchy有效的情況下,這個引數為0表示只繪製指定的輪廓;為1表示繪製所有的外輪廓和內嵌輪廓;為2表示維持所有的外輪廓、內嵌輪廓和內嵌輪廓之間的聯接輪廓。
offset:輪廓偏移值。

示例程式碼如下:

程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

執行結果截圖如下