1、矩形函数
Rect boundingRect(InputArray Points)
输入二维点集,可以输vector或Mat
返回外部矩形边界
2、寻找可旋转最小包围矩形
RotatedRect minAreaRect(InputArray points)
输入二维点集,可以输vector或Mat
3、寻找最小包围圆形
void minEnclosingCircle(InputArray points,Point2f ¢er,float radius)
参数一:输入二维点集,可以是vector或Mat类型
参数二:输出圆的中心
参数三:输出圆的半径
4、椭圆拟合二维点集
RotatedRect fitEllipse(InputArray points)
输入二维点集,可以输vector或Mat
5、逼近多边形曲线
void approxPloyDP(InputArray curve,OutputArray approxCurve,double epllison,bool closed)
参数一:输入二维点集,可以输vector或Mat
参数二:多边形逼近结果,其类型与参数一一致
参数三:逼近精度,为原始曲线和近似曲线的最大值
参数四:为真则为封闭曲线,为假则为不封闭曲线
示例:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【效果图】"
using namespace std;
using namespace cv;
Mat g_srcImage;
Mat g_grayImage;
int g_nThresh=50;
int g_nMaxThresh=255;
RNG g_rng(12345);
void on_ContoursChange(int,void *);
int main(int argc,char *argv[])
{
if(argc!=2)
{
cout<<"input error"<<endl;
return -1;
}
g_srcImage = imread(argv[1]);
if(g_srcImage.empty())
{
cout<<"read photo fail"<<endl;
return -1;
}
namedWindow(WINDOW_NAME1,WINDOW_AUTOSIZE);
imshow(WINDOW_NAME1,g_srcImage);
namedWindow(WINDOW_NAME2);
cvtColor(g_srcImage,g_grayImage,COLOR_BGR2GRAY);
blur(g_grayImage,g_grayImage,Size(3,3));
createTrackbar("阈值:",WINDOW_NAME2,&g_nThresh,g_nMaxThresh,on_ContoursChange);
on_ContoursChange(0,0);
waitKey(0);
return 0;
}
void on_ContoursChange(int ,void *)
{
Mat threshold_output;
vector<vector<Point> >contours;
vector<Vec4i>hierarchy;
//检测边缘
threshold(g_grayImage,threshold_output,g_nThresh,255,THRESH_BINARY);
//找出轮廓
findContours(threshold_output,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point(0,0));
//多边形逼近轮廓、获取矩形和圆形边界线
vector<vector<Point> >contours_poly(contours.size());
vector<Rect> boundRect(contours.size());
vector<Point2f> center(contours.size());
vector<float> radius(contours.size());
for(unsigned int i=0;i<contours.size();i++)
{
//用制定精度逼近多边形曲线
approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);
//计算点集最外面矩形边界
boundRect[i] = boundingRect(Mat(contours_poly[i]));
//对给定2D点集,寻找最小包围圆形
minEnclosingCircle(contours_poly[i],center[i],radius[i]);
}
Mat drawing = Mat::zeros(threshold_output.size(),CV_8UC3);
//绘制多边形轮廓、包围矩形框、圆形框
for(unsigned int i=0;i<contours.size();i++)
{
Scalar color = Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255));
drawContours(drawing,contours_poly,i,color,1,8,vector<Vec4i>(),0,Point());
rectangle(drawing,boundRect[i].tl(),boundRect[i].br(),color,2,8,0);
circle(drawing,center[i],(int)radius[i],color,2,8,0);
}
imshow(WINDOW_NAME2,drawing);
}
--------------来自opencv3编程入门 毛星云pdf