OpenCV 輪廓基本特徵

2021-07-11 17:20:34 字數 3397 閱讀 8137

一、概述

我們通過cvfindcontours( )函式獲取得影象輪廓有何作用呢?一般來說,我們對輪廓常用的操作有識別和處理,另外相關的還有多種對輪廓的處理,如簡化或擬合輪廓,匹配輪廓到模板,等等。

我們在輪廓處理中經常需要對輪廓變化一些特徵進行概括,比如長度或者一些反映輪廓整體大小的度量。另外輪廓矩也是概括輪廓的特徵的重要方法。

二、常見特徵函式

1、多邊形逼近

當我們繪製乙個多邊形或者進行形狀分析的時候,通常需要使用多邊形逼近乙個輪廓,使得頂點數目變少。

2、計算輪廓周長或曲線長度

double cvarclength( const void* curve, cvslice slice=cv_whole_seq, int is_closed=-1 );

curve 

曲線點集序列或陣列

slice 

曲線的起始點,預設是計算整個曲線的長度

is_closed 

表示曲線是否閉合,有三種情況:

is_closed=0 - 假設曲線不閉合

is_closed>0 - 假設曲線閉合

is_closed<0 - 若曲線是序列,檢查 ((cvseq*)curve)->flags 中的標識 cv_seq_flag_closed 來確定曲線是否閉合。否則 (曲線由點集的陣列 (cvmat*) 表示) 假設曲線不閉合。

函式 cvarclength 通過依次計算序列點之間的線段長度,並求和來得到曲線的長度。

3、計算整個輪廓或部分輪廓的面積

double cvcontourarea( const cvarr* contour, cvslice slice=cv_whole_seq );

contour

輪廓 (邊界點的序列或陣列).

slice

感興趣輪廓部分的起始點,預設是計算整個輪廓的面積。

函式 cvcontourarea 計算整個輪廓或部分輪廓的面積。 對後面的情況,面積表示輪廓部分和起始點連線構成的封閉部分的面積。如下圖所示:

備註: 輪廓的方向影響面積的符號。因此函式也許會返回負的結果。應用函式 fabs() 得到面積的絕對值。

4、計算點集的最外面(up-right)矩形邊界

cvrect cvboundingrect( cvarr* points, int update=0 );

points

二維點集,點的序列或向量 (cvmat)

update 

更新標識。下面是輪廓型別和標識的一些可能組合:

update=0, contour ~ cvcontour*:

不計算矩形邊界,但直接由輪廓頭的 rect 域得到。

update=1, contour ~ cvcontour*: 計算矩形邊界,而且將結果寫入到輪廓頭的 rect 域中 header.

update=0, contour ~ cvseq* or cvmat*: 計算並返回邊界矩形

update=1, contour ~ cvseq* or cvmat*: 產生執行錯誤 (runtime error is raised)

函式 cvboundingrect 返回二維點集的最外面 (up-right)矩形邊界。

5、對給定的 2d 點集,尋找最小面積的包圍矩形

cvbox2d cvminarearect2( const cvarr* points, cvmemstorage* storage=null );

points

點序列或點集陣列

storage

可選的臨時儲存倉

函式 cvminarearect2 通過建立凸外形並且旋轉外形以尋找給定 2d 點集的最小面積的包圍矩形。這個長方形很有可能是傾斜的。

6、對給定的 2d 點集,尋找最小面積的包圍圓形

int cvminenclosingcircle( const cvarr* points, cvpoint2d32f* center, float* radius );

points

點序列或點集陣列

center

輸出引數:圓心

radius

輸出引數:半徑 

函式 cvminenclosingcircle 對給定的 2d 點集迭代尋找最小面積的包圍圓形。如果產生的圓包含所有點,返回非零。否則返回零(演算法失敗)。

7、二維點集的橢圓擬合

cvbox2d cvfitellipse2( const cvarr* points );

points

點集的序列或陣列

函式 cvfitellipse 對給定的一組二維點集作橢圓的最佳擬合(最小二乘意義上的)。返回的結構與 cvellipse 中的意義類似,除了 size 表示橢圓軸的整個長度,而不是一半長度。

8、對兩個給定矩形,尋找矩形邊界

cvrect cvmaxrect( const cvrect* rect1, const cvrect* rect2 );

rect1

第乙個矩形

rect2

第二個矩形

函式 cvmaxrect 尋找包含兩個輸入矩形的具有最小面積的矩形邊界。

9、尋找盒子的頂點

void cvboxpoints( cvbox2d box, cvpoint2d32f pt[4] );

box 盒子

pt  頂點陣列

函式 cvboxpoints 計算輸入的二維盒子的頂點。

10、測試點是否在多邊形中

double cvpointpolygontest( const cvarr* contour, cvpoint2d32f pt, int measure_dist );

contour

輸入輪廓.

pt 針對輪廓需要測試的點。

measure_dist

如果非0,函式將估算點到輪廓最近邊的距離。

函式cvpointpolygontest 決定測試點是否在輪廓內,輪廓外,還是輪廓的邊上(或者共邊的交點上),它的返回值是正負零,相對應的,當measure_dist=0時,返回值是1, -1,0, 同樣當 measure_dist≠0 ,它是返回乙個從點到最近的邊的帶符號距離。

opencv 輪廓特徵2

函式 moments moments inputarray array,bool binaryimage false 用來計算多邊形或珊格形狀的0 3階矩。moments類定義如下 classmoments mxx是0 3階矩,muxx是0 3階中心矩,nuxx是0 3階歸一化中心矩,公式如下 當計...

RTOS基本特徵

實時作業系統與其相對的是分時作業系統,unix就是典型的分時作業系統。當分時作業系統允許對中斷處理的優先順序做調整,是系統對外部的事件響應的速度保證不大於某一特定的時間間隔時,就構成了實時作業系統。1 實時性 響應外部事件的時間必須在限定的時間範圍內,在某些情況下還需要是確定的 可重複實現的,不管當...

物件導向基本特徵

通過學習設計模式對物件導向程式設計有了更深層次的了解。在 大話設計模式 一書中的第乙個設計模式裡 簡單工廠模式 體會到了自己學習物件導向程式設計時的歷程。首先要保證 無錯,我想這是大部分初學者的心願。其次就是 規範,這一點是很重要的,程式不僅僅是寫給自己看的,更需要讓別人能看懂。別人能看懂還不行,畢...