@
- 1.查詢輪廓
- 1.1 API
- 1.2 輪廓層級檢測模式:索引號(層級)
- RETR_EXTERNAL(索引順序:從右下到左上)
- RETR_LIST(recommended)(索引順序:從右下到左上,由外到內)
- RETR_CCOMP(not recommended)(索引順序:由內到外,從右下到左上)
- RETR_TREE(recommended)
- 1.3 輪廓座標點儲存方式
- 2.繪製輪廓
- 3.輪廓面積和周長
- 3.1 面積(非原地演算法)
- 3.2周長(非原地演算法)
- 4.多邊形逼近
- 5.凸包
- 6.外接矩形
- 6.1最小外接矩形(返回RotatedRect)
- 6.2最大外界矩形(返回Rect)
1.查詢輪廓
1.1 API
CV_EXPORTS_W void findContours( InputArray image, OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset = Point());
/** @overload */
CV_EXPORTS void findContours( InputArray image, OutputArrayOfArrays contours,
int mode, int method, Point offset = Point());
引數 |
含義 |
image |
輸入圖片,資料型別Mat |
contours |
儲存輸出輪廓的點座標。通常用vector<vector<Point>> 資料型別擔任,透過Point可以看出儲存的是座標。 |
hierarchy |
可選引數,儲存輸出輪廓的層級關係。通常用vector<Vec4i> 資料型別擔任。 詳見下文 |
mode |
輪廓層級的檢測模式 ,詳見下文 |
method |
輪廓座標點的儲存方式 ,詳見下文 |
offset |
額外偏移量,在每一個檢測出的輪廓點上加上該偏移量,可以是負值。當所分析影像是另外一個影像的ROI的時候,透過加減這個偏移量,可以把ROI影像的檢測結果投影到原始影像對應位置上。 |
- hierarchy[i][0]:第i個輪廓的同一層級後一個輪廓的索引編號。
- hierarchy[i][1]:第i個輪廓的同一層級前一個輪廓的索引編號。
- hierarchy[i][2]:第i個輪廓的子輪廓的索引編號。
- hierarchy[i][3]:第i個輪廓的父輪廓的索引編號。
- 如果當前輪廓沒有對應的後一個輪廓、前一個輪廓、父輪廓或內嵌輪廓的話,則hierarchy[i][0] ~hierarchy[i][3]的相應位被設定為預設值-1。
1.2 輪廓層級檢測模式:索引號(層級)
enum RetrievalModes {
RETR_EXTERNAL = 0,
RETR_LIST = 1,
RETR_CCOMP = 2,
RETR_TREE = 3,
};
RETR_EXTERNAL(索引順序:從右下到左上)
只檢測最外圍輪廓,包含在外圍輪廓內的內圍輪廓被忽略
RETR_LIST(recommended)(索引順序:從右下到左上,由外到內)
檢測所有的輪廓,包括內圍、外圍輪廓,但是檢測到的輪廓不建立層級關係,這就意味著這個檢索模式下不存在父輪廓或內嵌輪廓,所以hierarch[i]向量內所有元素的第3、第4個分量都會被置為-1。
RETR_CCOMP(not recommended)(索引順序:由內到外,從右下到左上)
檢測所有的輪廓,但所有輪廓只建立兩個等級關係,外圍為頂層,若外圍內的內圍輪廓還包含了其他的輪廓資訊,則內圍內的所有輪廓均歸屬於頂層
RETR_TREE(recommended)
檢測所有輪廓,所有輪廓建立一個等級樹結構。外層輪廓包含內層輪廓,內層輪廓還可以繼續包含內嵌輪廓。
1.3 輪廓座標點儲存方式
enum ContourApproximationModes {
CHAIN_APPROX_NONE = 1,
CHAIN_APPROX_SIMPLE = 2,
CHAIN_APPROX_TC89_L1 = 3,
CHAIN_APPROX_TC89_KCOS = 4
};
method可選值 |
含義 |
CHAIN_APPROX_NONE |
儲存物體邊界上所有連續的輪廓點到contours向量內 |
CHAIN_APPROX_SIMPLE(recommended) |
僅儲存輪廓的拐點資訊,把所有輪廓拐點處的點儲存入contours向量內,拐點與拐點之間直線段上的資訊點不予保留,效率比較高。 |
CHAIN_APPROX_TC89_L1或CV_CHAIN_APPROX_TC89_KCOS |
使用tehChinl chain 近似演算法(not important) |
2.繪製輪廓
2.1 API
CV_EXPORTS_W 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 |
繪製輪廓的畫布,資料型別Mat |
contours |
輸入輪廓,資料型別vector<vector<Point>> |
contourIdx(contour index) |
欲繪製的輪廓的索引值,輸入-1可以繪製所有輪廓 |
color |
繪製線條的顏色 |
thickness |
繪製線條的粗細。若取負值,則表示進行填充 |
lineType |
繪製線條的連通型別 |
hierarchy |
可選的層次結構資訊。它僅在當你需要繪製一些輪廓線時被使用。(詳見引數maxLevel)預設為noArray(),返回一個空陣列。 |
maxLevel |
繪製輪廓線的最高階別。此引數僅在引數hierarchy有效時被考慮。詳見下表 |
offset |
額外偏移量,在每一個繪製出的輪廓點上加上該偏移量,可以是負值。當所分析影像是另外一個影像的ROI的時候,透過加減這個偏移量,可以把ROI影像的繪製結果投影到原始影像對應位置上。 |
maxLevel可選值 |
含義 |
0 |
只有被指定的輪廓被繪製 |
1 |
繪製被指定的輪廓和其下一級輪廓 |
2 |
繪製被指定的輪廓和其所有子輪廓 |
3.輪廓面積和周長
3.1 面積(非原地演算法)
CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false );
引數 |
含義 |
contour |
某一個輪廓,資料型別vector<Point> |
oriented |
有方向的區域標誌(not important)。若為true: 此函式依賴輪廓的方向(順時針或逆時針)返回一個已標記區域的值。若為false: 預設值,意味著返回不帶方向的絕對值。 |
- 此函式利用格林公式計算輪廓的面積。對於具有自交點的輪廓,該函式幾乎肯定會給出錯誤的結果。
3.2周長(非原地演算法)
CV_EXPORTS_W double arcLength( InputArray curve, bool closed );
引數 |
含義 |
curve |
某一個輪廓,資料型別vector<Point> |
closed |
輪廓是否是閉合的 |
4.多邊形逼近
CV_EXPORTS_W void approxPolyDP( InputArray curve,
OutputArray approxCurve,
double epsilon, bool closed );
引數 |
含義 |
curve |
某一個輪廓,資料型別vector<Point> |
approxCurve |
輸出多邊形的點集,資料型別vector<Point> |
epsilon |
設定精度,越小則精度越高,多邊形越趨近於曲線,擬合效果更好但效率低。 |
closed |
輪廓是否是閉合的 |
5.凸包
CV_EXPORTS_W void convexHull( InputArray points, OutputArray hull,
bool clockwise = false, bool returnPoints = true );
引數 |
含義 |
points |
輸入點集,資料型別vector<Point> |
hull |
輸出凸包。資料型別取決於returnPoints,vector<Point>或vector<int> |
clockwise |
擬合凸包的直線的轉動方向,TRUE為順時針,否則為逆時針。 |
returnPoints |
若為true,則在hull中儲存點的座標。若為false,則在hull中儲存點的索引,索引值根據引數points得到。預設為true |
6.外接矩形
6.1最小外接矩形(返回RotatedRect)
CV_EXPORTS_W RotatedRect minAreaRect( InputArray points );
引數 |
含義 |
points |
輸入點集,資料型別vector<Point> |
6.2最大外界矩形(返回Rect)
CV_EXPORTS_W Rect boundingRect( InputArray array );
引數 |
含義 |
points |
輸入點集,資料型別vector<Point> |
本文由部落格一文多發平臺 OpenWrite 釋出!