【OpenCV教程】輪廓檢測過程

UnderTurrets發表於2024-08-20

@

目錄
  • 1.查詢輪廓
    • 1.1 API
    • 1.2 輪廓層級檢測模式:索引號(層級)
      • RETR_EXTERNAL(索引順序:從右下到左上)
      • RETR_LIST(recommended)(索引順序:從右下到左上,由外到內)
      • RETR_CCOMP(not recommended)(索引順序:由內到外,從右下到左上)
      • RETR_TREE(recommended)
    • 1.3 輪廓座標點儲存方式
  • 2.繪製輪廓
    • 2.1 API
  • 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可選值如下
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可選值如下
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 釋出!

相關文章