opencv包絡圓 OpenCV 輪廓基本特徵

2021-10-13 14:34:01 字數 3347 閱讀 8840

一、概述

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

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

二、常見特徵函式

1、多邊形逼近

int method, double parameter, int parameter2=0 );

src_seq

點集陣列序列

header_size

逼近曲線的頭尺寸

storage

逼近輪廓的容器。如果為 null, 則使用輸入的序列

method

parameter

parameter2

如果 src_seq 是序列,它表示要麼逼近單個序列,要麼在 src_seq 的同乙個或低階層次上逼近所有序列 (參考 cvfindcontours 中對輪廓繼承結構的描述). 如果 src_seq 是點集的陣列 (cvmat*) , 引數指定曲線是閉合 (parameter2!=0) 還是非閉合 (parameter2=0).

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 霍夫圓變換

參考 1 官方文件api 2 d6 d00 tutorial py root.html 官方英文教程 3 4 高階教程 5 官方英文教程 6 7 8 opencv論壇 9 官方github 10 注 安裝的版本 opencv python 3.3.0 cp36 cp36m win amd64.whl...

OpenCV 圓與矩形識別

最近乙個專案用到了影象識別,之前從未接觸過opencv,經過各種找教程,終於是搞懂了一些。整個具體流程大概是獲取影象 影象二值化,灰度圖 cvtcolor 影象降噪 gaussianblur 輪廓識別 cvfindcontours 形狀判斷。大多數教程很專業,各種引數分析看不懂,經過各種搜尋終於是搞...

OpenCV識別圓(複雜背景下的圓)

參考 hsl powerpoint中顏色模式之一 即色相 飽和度 亮度 英語 hue,saturation,lightness hsv opencv中的顏色模式 即色相 飽和度 明度 英語 hue,saturation,value 又稱hsb,其中b即英語 brightness。由於這裡使用open...