OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

目录

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 分钟前
Schrodinger Suites 2026 专业版全面介绍:药物发现与材料科学计算一体化平台
人工智能
云和数据.ChenGuang9 分钟前
JAVAEE AI工程师路线图
java·人工智能·java-ee·fastapi·springai·langchain4j
Latchh11 分钟前
PDF提取到文字后怎样发现乱码
图像处理·人工智能·计算机视觉·pdf
mit6.82413 分钟前
论拼多多的反向计划经济秩序
人工智能
熊猫钓鱼>_>14 分钟前
从2D平铺到3D沉浸:我用HarmonyOS 7端侧AI做了一个全程数据不出设备的空间化私密相册
前端·人工智能·3d·华为·华为云·harmonyos·鸿蒙
YOLO数据集集合17 分钟前
空中目标检测数据集 | 空中目标检测 无人机识别 鸟类检测 低空安防 反无人机数据集 鸟类 直升机9154期
人工智能·目标检测·计算机视觉·无人机·空中目标·反无人机
welfare96218 分钟前
新号别搞:vector
c++
Carl_奕然19 分钟前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
Martina_032123 分钟前
AI生成的盔甲换动作后漂移?用6步检查挂点、骨架映射与 Bind Pose
人工智能·游戏·3d·ai·自然语言处理·aigc·游戏策划
Ivanqhz23 分钟前
KV Cache
服务器·数据库·人工智能·深度学习·算法