OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
作者:小教学发布时间:2023-09-26分类:程序开发学习浏览:78
导读:目录1.轮廓外接最大矩形boundingRect()2.轮廓外接最小矩形minAreaRect()3.轮廓外接多边形approxPolyDP()1.轮廓外接最大...
目录
1.轮廓外接最大矩形boundingRect()
2.轮廓外接最小矩形minAreaRect()
3.轮廓外接多边形approxPolyDP()
1.轮廓外接最大矩形boundingRect()
Rect cv::boundingRect ( InputArray array )
- array:输入的灰度图像或者2D点集,数据类型为vector<Point>或者Mat。
示例代码:
//轮廓最大外接矩阵
void Contour_external_maxmatrix(Mat image) {
Mat gray,binary;
cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
//轮廓检测
vector<vector<Point>> contours;//轮廓
vector<Vec4i> hierarchy;//存放轮廓结构变量
findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
//寻找轮廓的外接矩阵
for(int n=0;n<contours.size();n++) {
//最大外接矩阵
Rect rect = boundingRect(contours[n]);
rectangle(image, rect, Scalar(7, 67, 255), 2, 8, 0);
}
imwrite("/sdcard/DCIM/max.png",image);
}
轮廓外接最大矩形的结果:
2.轮廓外接最小矩形minAreaRect()
RotatedRect cv::minAreaRect ( InputArray points )
- array:输入的灰度图像或者2D点集,数据类型为vector<Point>或者Mat。
示例代码:
//轮廓最小外接矩阵
void Contour_external_minmatrix(Mat image){
Mat gray,binary;
cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
//轮廓检测
vector<vector<Point>> contours;//轮廓
vector<Vec4i> hierarchy;//存放轮廓结构变量
findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
//寻找轮廓的外接矩阵
for(int n=0;n<contours.size();n++) {
//最小外接矩阵
RotatedRect rrect= minAreaRect(contours[n]);
Point2f points[4];
rrect.points(points);//读取最小外接矩阵的四个顶点
Point2f cpt=rrect.center;//最小外接矩阵的中心
//绘制旋转矩阵与中心位置
for(int i=0;i<4;i++){
if(i==3){
line(image,points[i],points[0],Scalar(0,0,255,255),2,8,0);
break;
}
line(image,points[i],points[i+1],Scalar(0,0,255,255),2,8,0);
}
//绘制矩阵中心
circle(image,cpt,4,Scalar(0,0,255,255),-1,8,0);
}
imwrite("/sdcard/DCIM/min.png",image);
}
轮廓外接最小矩形的结果:
3.轮廓外接多边形approxPolyDP()
void cv::approxPolyDP (InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed
)
- curve:输入轮廓像素点。
- approxCurve:多边形逼近结果,以多边形顶点坐标的形式给出
- epsilon:逼近的精度,即原始曲线和逼近曲线之间的最大距离。
- closed:逼近曲线是否为封闭曲线的标志, true表示曲线封闭,即最后一个顶点与第一个顶点相连
示例代码:
void drawapp(Mat result,Mat img2){
for(int i=0;i<result.rows;i++){
//最后一个坐标点与第一个坐标点连接
if(i==result.rows-1){
Vec2i point1=result.at<Vec2i>(i);
Vec2i point2=result.at<Vec2i>(0);
line(img2,point1,point2,Scalar(0,0,255,255),4,8,0);
break;
}
Vec2i point1=result.at<Vec2i>(i);
Vec2i point2=result.at<Vec2i>(i+1);
line(img2,point1,point2,Scalar(0,0,255,255),4,8,0);
}
}
//轮廓多边形拟合
void Contour_external_matrix(Mat image){
Mat gray,binary;
cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
// GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
// threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
//轮廓的发现与绘制
vector<vector<Point>> contours;//轮廓
vector<Vec4i> hierarchy;//存放轮廓结构变量
findContours(gray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
//绘制多边形
for(int n=0;n<contours.size();n++) {
//用最小外接矩阵求取轮廓中心
RotatedRect rrect= minAreaRect(contours[n]);
Point2f center=rrect.center;//最小外接矩阵的中心
circle(image,center,2,Scalar(0,0,255,255),2,8,0);
Mat result;
approxPolyDP(contours[n],result,4,true);//多边形拟合
drawapp(result,image);
}
imwrite("/sdcard/DCIM/matrix.png",image);
}
多边形拟合的结果:
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 8[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版