Opencv繪制最小外接矩形、最小外接圓
Opencv中求點集的最小外結矩使用方法minAreaRect,求點集的最小外接圓使用方法minEnclosingCircle。
minAreaRect方法原型:
RotatedRect minAreaRect( InputArray points );
輸入參數points是所要求最小外結矩的點集數組或向量;
minEnclosingCircle方法原型:
void minEnclosingCircle( InputArray points,
CV_OUT Point2f& center, CV_OUT float& radius );
第一個參數points是所要求最小外結圓的點集數組或向量;
第二個參數Point2f類型的center是求得的最小外接圓的中心坐標;
第三個參數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); //最小外結圓畫布
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);
//繪制輪廓的最小外結矩形
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);
}
//繪制輪廓的最小外結圓
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方法求輪廓的最小外接矩形,轉化求得矩形的四個頂點坐標,并繪制矩形;
4. 使用minEnclosingCircle方法求輪廓的最小外接圓,獲取圓心和半徑信息,并繪制圓;
原始圖像:

最小外接矩:

最小外接圓:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
計時器的time_t和clock_t 的兩種實現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄嫊r器的time_t和clock_t 的兩種實現(xiàn)方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10
QT線程池的使用(QThreadPool類和QRunnable類)
本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04

