opencv中使用findcontours函式來查詢輪廓,
這個函式的原型為:
1view codevoid 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
*/
findcontours函式經常與drawcontours配合使用,用來將輪廓繪製出來,函式原型為:
1view codevoid 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
*/
得到了複雜輪廓往往不適合特徵的檢測,這裡再介紹乙個點集凸包絡的提取函式convexhull,輸入引數就可以是contours組中的乙個輪廓,返回外凸包絡的點集。
還可以得到輪廓的外包絡矩形,使用boundingrect,函式原型為:
1如果想得到旋轉的外包絡矩形,使用函式minarearect 函式原型:rect boundingrect(inputarray points)23
//points:二維點集4//
返回:包圍輪廓的2d矩形的模板類rect5//
功能:對指定的點集進行包含,使得形成乙個最合適的正向矩形框把當前指定的點集都框住
1也可以得到輪廓的外包絡圓,對應的函式為minenclosingcircle;想得到輪廓的外包絡橢圓,對應的函式為fitellipse,返回值也是rotatedrect型別,可以用ellipse函式畫出對應的橢圓;rotatedrect minarearect(inputarray points)2//
points:輸入的2維向量點,其型別為:std::vector<> or mat
3///
/函式功能:為乙個指定的點集計算並返回的最小邊界矩形(可能旋轉)
4 //返回值型別:rotatedrect
如果想根據多邊形的輪廓資訊得到多邊形的多階矩,可以使用類moments;
如果想獲得一點與多邊形封閉輪廓資訊,可以呼叫pointpolygontest函式,這個函式返回值為該點距離輪廓最近邊界的距離,為正值為在輪廓內部,負值為在輪廓外部,0表示在邊界上。
example
1 #include "view codeopencv2/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 }
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...