一、概述
我們通過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 實時性 響應外部事件的時間必須在限定的時間範圍內,在某些情況下還需要是確定的 可重複實現的,不管當...
物件導向基本特徵
通過學習設計模式對物件導向程式設計有了更深層次的了解。在 大話設計模式 一書中的第乙個設計模式裡 簡單工廠模式 體會到了自己學習物件導向程式設計時的歷程。首先要保證 無錯,我想這是大部分初學者的心願。其次就是 規範,這一點是很重要的,程式不僅僅是寫給自己看的,更需要讓別人能看懂。別人能看懂還不行,畢...