opencv學習筆記(二)尋找輪廓

2021-09-08 04:09:26 字數 3541 閱讀 8129

opencv中使用findcontours函式來查詢輪廓,

這個函式的原型為:

1

void findcontours(inputoutputarray image, outputarrayofarrays contours, outputarray hierar-

2 chy, int mode, int method, point offset=point())34

/*5引數說明:67

image:輸入影象image必須為乙個2值單通道影象;89

contours:為檢測的輪廓陣列,每乙個輪廓用乙個point型別的vector表示,vector,則輪廓的集合可表示為vector>;

1011

hiararchy:引數和輪廓個數相同,每個輪廓contours[i]對應hierarchy元素hierarchy[i][0]—hierarchy[i][3],分別表示後乙個輪廓、前乙個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,該值設定為負數;

1213

mode:輪廓的檢索模式

1415

a.cv_retr_external:表示只檢測外輪廓

1617

b.cv_retr_list:檢測的輪廓不建立登記關係

1819

c.cv_retr_ccomp:建立兩個等級的輪廓,上面的一層為外邊界,裡面的一層為內孔的邊界資訊。如果內孔內還有乙個連通物體,這個物體的邊界也在頂層。

2021

d.cv_retr_tree:建立乙個等級樹結構的輪廓。

2223

method:輪廓的近似方法

2425

2627

2829

*/

view code

findcontours函式經常與drawcontours配合使用,用來將輪廓繪製出來,函式原型為:

1

void drawcontours(inputoutputarray image, inputarrayofarrays contours, int contouridx, const scalar& color, int thickness=1, int linetype=8, inputarray hierarchy=noarray(), int maxlevel=int_max, point offset=point() )23

/*4引數說明:56

image:目標影象78

contours:輸入的輪廓組,每一組輪廓由點vector構成910

contouridx:指明畫第幾個輪廓,如果該引數為負值,則畫全部輪廓

1112

color:輪廓的顏色

1314

thickness:輪廓的線寬,如果為負值或cv_filled表示填充輪廓內容

1516

linetype:為線型

1718

hierarchy:如果你想畫出影象的一部分輪廓,那麼你就需要它

1920

maxlevel:用於畫輪廓的最大成,如果為0,只是畫出指定輪廓,如果為1,畫出第一層的所有輪廓,如果為2,畫出第一和第二層的所有輪廓,依次類推,這個引數只有在有層次關係的時候被使用

2122

offset:每個輪廓點的偏移量

2324

*/

view code

得到了複雜輪廓往往不適合特徵的檢測,這裡再介紹乙個點集凸包絡的提取函式convexhull,輸入引數就可以是contours組中的乙個輪廓,返回外凸包絡的點集。

還可以得到輪廓的外包絡矩形,使用boundingrect,函式原型為:

1

rect boundingrect(inputarray points)23

//points:二維點集4//

返回:包圍輪廓的2d矩形的模板類rect5//

功能:對指定的點集進行包含,使得形成乙個最合適的正向矩形框把當前指定的點集都框住

如果想得到旋轉的外包絡矩形,使用函式minarearect 函式原型:

1

rotatedrect minarearect(inputarray points)2//

points:輸入的2維向量點,其型別為:std::vector<> or mat

3///

/函式功能:為乙個指定的點集計算並返回的最小邊界矩形(可能旋轉)

4 //返回值型別:rotatedrect

也可以得到輪廓的外包絡圓,對應的函式為minenclosingcircle;想得到輪廓的外包絡橢圓,對應的函式為fitellipse,返回值也是rotatedrect型別,可以用ellipse函式畫出對應的橢圓;

如果想根據多邊形的輪廓資訊得到多邊形的多階矩,可以使用類moments;

如果想獲得一點與多邊形封閉輪廓資訊,可以呼叫pointpolygontest函式,這個函式返回值為該點距離輪廓最近邊界的距離,為正值為在輪廓內部,負值為在輪廓外部,0表示在邊界上。

example

1 #include "

opencv2/highgui/highgui.hpp

"2 #include "

opencv2/imgproc/imgproc.hpp

"3 #include 4

using

namespace

cv;5

using

namespace

std;

6int

main()718

19 namedwindow("

img", 1

);20 imshow("

img"

, img);

21//

二值化,為提取輪廓做準備

22 threshold(img, img, 0, 255, cv_thresh_otsu +cv_thresh_binary);

23 namedwindow("

thr_img

", 1

);24 imshow("

thr_img

", img);

25//

建立輪廓集合

26 vector>contours;

27//

建立層級hierarchy

28 vectorhierarchy;

29 mat dst =mat::zeros(img.rows, img.cols, cv_8uc3);

3031

if (!contours.empty() && !hierarchy.empty())

3239

}40 namedwindow("

connected components

", 1

);41 imshow("

connected components

", dst);

42 waitkey(0

);43

return0;

44 }

view code

opencv尋找輪廓 繪製輪廓 輪廓層級原理

void findcontours inputoutputarray image,outputarrayofarrays contours,outputarray hierarchy,int mode,int method,point offset point 引數image inputarray型...

opencv學習 輪廓分析尋找近似圓

這是一張經過處理後的紅燈的影象,我們需要找到其中的紅燈,可以看到是兩個圓,用霍夫圓之後發現其中調參非常麻煩,於是寫了乙個根據輪廓來分析圓的演算法。演算法思想 findcontours 找到影象的輪廓,使用minenclosingcircle 找到輪廓的最小包圍矩形,計算輪廓上的每個點到圓心的距離和半...

opencv2中尋找輪廓

最近想嘗試用opencv做專案,發現需要考慮的細節很多,用商業庫用習慣了,有點不適應,慢慢來吧。上網查了查用opencv做連通域運算,發現都是先尋找輪廓,那就先來學習下輪廓。opencv中尋找輪廓的c 函式是 void findcontours inputoutputarray image outp...