OpenCV輪廓特性(二)

2021-07-01 20:52:49 字數 1653 閱讀 4278

(1)輪廓的多邊形逼近

const void* src_seq,

int header_size,

cvmemstorage* storage,

int method,//method的取值上篇博文中介紹了

double

parameter, //表示逼近的精度

intrecursive=0 //指定是否針對全部的輪廓,取0表示只處理src_seq指向輪廓

);簡要介紹這個逼近演算法的思路,如下圖所示:

演算法先從輪廓(圖b)上選擇2個最遠的點,然後將2個連成乙個線段(圖c),然後再查詢輪廓上到線段距離最遠的點,新增到逼近後的新輪廓(圖d),演算法反覆迭代,不斷的將最遠的點新增到結果中,直到所有的點到多邊形的最短距離小於parameter引數指定的精度。

(2)輪廓的關鍵點

輪廓的關鍵點指的是那些包含曲線資訊比較多的點,在opencv中主要給出了ipan演算法,這個演算法在opencv中給出了函式cvfinddominantpoints()來實現

cvseq* cvfinddominantpoints(

cvseq* contour,

cvmemstorage* storage,

int method=cv_dominant_ipan,

double

parameters1=0,

double

parameters2=0,

double

parameters3=0,

double

parameters4=0//引數分別為最短距離,最長距離,相鄰距離,最大角度

ipan演算法通過掃瞄輪廓上並在曲線內部使用可能頂點構造三角形來實現。對於三角形的大小和張角有特殊要求,在比某一特定的全域性閾值和它的相鄰點的張角小的情況下,具有大張角的點被保留。

(3)輪廓的周長和面積

若要得到輪廓的長度,可以使用以下的函式cvarclength();

與輪廓的長度相關聯的就是輪廓的面積了,可以用函式cvcontourarea()。

(4)輪廓的邊界

周長和面積只是輪廓的簡單特性,更複雜一點的特性應該是矩形邊界框、圓形邊界框或橢圓邊界框。有兩種方法可以得到矩形邊界框,但是圓形和橢圓形邊界框只有一種方法。

矩形:在影象處理系統中提供了一種叫rectangle的矩形,不過它只能表達邊垂直或水平的特例;但也有一種矩形是box的,可以表示任何傾斜的情況。

如果要獲取輪廓的rectangle,可以使用cvboundingrect()函式。

如果要獲取輪廓的box,可以使用cvminarearect2()函式。

圓形:如果要獲取輪廓的圓形邊界框,可以使用cvminenclosingcircle函式。

橢圓:如果要獲取輪廓的橢圓邊界框,可以使用cvfitellipse2函式。

上面就是介紹了如何去分析乙個輪廓的特性,分別從周長、面積、邊界框等角度去分析輪廓的特徵,而這些特徵的提取是為了接下來更好的對這些輪廓特徵的操作,因此在接下來,我們再去討論下對輪廓的典型操作,就是輪廓的匹配。

OpenCV輪廓特性

在這裡,我們將學習提取一些常用的性質的物體,如固體,等效直徑,面具影象,平均強度等。它是物體的寬度與高度的比值。x,y,w,h cv2.boundingrect cnt aspect ratio float w h 範圍是等高線面積與邊框面積之比。area cv2.contourarea cnt x...

OpenCV 刪除輪廓的方法(二)

利用vector迭代器 iterator 遍歷內容,利用erase 函式刪除輪廓,實驗設計為小於20的輪廓被刪除,為了效果更明顯,在閾值分割前不做平滑和濾波的處理,如下 include include include include include using namespace std using...

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

opencv中使用findcontours函式來查詢輪廓,這個函式的原型為 1 void findcontours inputoutputarray image,outputarrayofarrays contours,outputarray hierar 2 chy,int mode,int me...