OpenCV學習 32 求輪廓的包圍盒

2021-09-06 12:43:45 字數 2055 閱讀 7618

在opencv中,能夠很方便的求輪廓包圍盒。包括矩形,圓形,橢圓形以及傾斜的矩形(包圍面積最小)集中包圍盒。用到的四個函式是:

rect boundingrect

(inputarraypoints)

void minenclosingcircle

(inputarraypoints, point2f&center, float&radius)

rotatedrect minarearect

(inputarraypoints)

rotatedrect fitellipse

(inputarraypoints)

輸入的引數都是輪廓,下面是程式**:

1. rect和原型包圍盒**:

//轉化為灰度圖並進行blur操作

cvtcolor( src, src_gray, cv_bgr2gray );

blur( src_gray, src_gray, size(3,3) );

namedwindow( "source", cv_window_autosize );

imshow( "source", src );

mat threshold_output;

vector> contours;

vectorhierarchy;

//得到二值影象

threshold( src_gray, threshold_output, thresh, 255, thresh_binary );

//查詢輪廓

vector> contours_poly( contours.size() );

vectorboundrect( contours.size() );

vectorcenter( contours.size() );

vectorradius( contours.size() );

//得到每個輪廓的包圍盒rect以及園,園用中心和半徑表示

mat drawing = mat::zeros( threshold_output.size(), cv_8uc3 );

for( int i = 0; i< contours.size(); i++ )

namedwindow( "contours", cv_window_autosize );

imshow( "contours", drawing );

while(1)

waitkey(0);

return(0);}

程式執行效果:

2. 橢圓形和傾斜的矩形包圍盒**:

int main( int argc, char** argv )

}//畫輪廓和包圍盒

mat drawing = mat::zeros( threshold_output.size(), cv_8uc3 );

for( int i = 0; i< contours.size(); i++ )

namedwindow( "contours", cv_window_autosize );

imshow( "contours", drawing );

while(1)

waitkey(0);

return(0);

}

程式執行效果:

opencv 根據模板凸包求閾值化後的輪廓組合

影象處理中,要求特徵與背景的對比度高,同時,合適的影象分割也是解決問題的關鍵。博主以前的方法,預設為特徵必然是最大的連通域,所以閾值化後,查詢輪廓,直接提取面積最大的輪廓即可。但可能會存在另一種情況,不論怎麼閾值化和膨脹,想要的特徵被分成好幾塊,也即斷開了。此時,再加上一些不可 的干擾和雜訊,fin...

OpenCV學習 輪廓的特徵矩Moment

opencv中的矩主要包括以下幾種 空間矩,中心矩和中心歸一化矩。class moments 空間矩的公式為 可以知道,對於01二值化的影象,m00即為輪廓的面積。中心矩的公式為 其中 歸一化的中心矩公式為 矩的基本概念可參考 在opencv中,還可以很方便的得到hu不變距,hu不變矩在影象旋轉 縮...

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

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