Opencv繪制最小外接矩形、最小外接圓
Opencv中求點集的最小外結(jié)矩使用方法minAreaRect,求點集的最小外接圓使用方法minEnclosingCircle。
minAreaRect方法原型:
RotatedRect minAreaRect( InputArray points );
輸入?yún)?shù)points是所要求最小外結(jié)矩的點集數(shù)組或向量;
minEnclosingCircle方法原型:
void minEnclosingCircle( InputArray points, CV_OUT Point2f& center, CV_OUT float& radius );
第一個參數(shù)points是所要求最小外結(jié)圓的點集數(shù)組或向量;
第二個參數(shù)Point2f類型的center是求得的最小外接圓的中心坐標(biāo);
第三個參數(shù)float類型的radius是求得的最小外接圓的半徑;
使用minAreaRect和minEnclosingCircle方法分別求最小外接矩和圓:
#include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/imgproc.hpp" #include "iostream" using namespace std; using namespace cv; int main(int argc,char *argv[]) { Mat imageSource=imread(argv[1],0); imshow("Source Image",imageSource); Mat image; blur(imageSource,image,Size(3,3)); threshold(image,image,0,255,CV_THRESH_OTSU); imshow("Threshold Image",image); //尋找最外層輪廓 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(image,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_NONE,Point()); Mat imageContours=Mat::zeros(image.size(),CV_8UC1); //最小外接矩形畫布 Mat imageContours1=Mat::zeros(image.size(),CV_8UC1); //最小外結(jié)圓畫布 for(int i=0;i<contours.size();i++) { //繪制輪廓 drawContours(imageContours,contours,i,Scalar(255),1,8,hierarchy); drawContours(imageContours1,contours,i,Scalar(255),1,8,hierarchy); //繪制輪廓的最小外結(jié)矩形 RotatedRect rect=minAreaRect(contours[i]); Point2f P[4]; rect.points(P); for(int j=0;j<=3;j++) { line(imageContours,P[j],P[(j+1)%4],Scalar(255),2); } //繪制輪廓的最小外結(jié)圓 Point2f center; float radius; minEnclosingCircle(contours[i],center,radius); circle(imageContours1,center,radius,Scalar(255),2); } imshow("MinAreaRect",imageContours); imshow("MinAreaCircle",imageContours1); waitKey(0); return 0;
作圖步驟:
1. 對原始圖像均值濾波并二值化;
2. 求圖像的最外層輪廓;
3. 使用minAreaRect方法求輪廓的最小外接矩形,轉(zhuǎn)化求得矩形的四個頂點坐標(biāo),并繪制矩形;
4. 使用minEnclosingCircle方法求輪廓的最小外接圓,獲取圓心和半徑信息,并繪制圓;
原始圖像:
最小外接矩:
最小外接圓:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
計時器的time_t和clock_t 的兩種實現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄嫊r器的time_t和clock_t 的兩種實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10QT線程池的使用(QThreadPool類和QRunnable類)
本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04