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


    目录

    1.轮廓外接最大矩形boundingRect()

    2.轮廓外接最小矩形minAreaRect()

    3.轮廓外接多边形approxPolyDP()


    1.轮廓外接最大矩形boundingRect()

    Rect cv::boundingRect ( InputArray array )

    • array:输入的灰度图像或者2D点集,数据类型为vector或者Mat。

    示例代码

    1. //轮廓最大外接矩阵
    2. void Contour_external_maxmatrix(Mat image) {
    3. Mat gray,binary;
    4. cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
    5. GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
    6. threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
    7. //轮廓检测
    8. vector<vector<Point>> contours;//轮廓
    9. vector<Vec4i> hierarchy;//存放轮廓结构变量
    10. findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
    11. //寻找轮廓的外接矩阵
    12. for(int n=0;n<contours.size();n++) {
    13. //最大外接矩阵
    14. Rect rect = boundingRect(contours[n]);
    15. rectangle(image, rect, Scalar(7, 67, 255), 2, 8, 0);
    16. }
    17. imwrite("/sdcard/DCIM/max.png",image);
    18. }

     轮廓外接最大矩形的结果:

    2.轮廓外接最小矩形minAreaRect()

    RotatedRect cv::minAreaRect ( InputArray points )

    • array:输入的灰度图像或者2D点集,数据类型为vector或者Mat。

    示例代码:

    1. //轮廓最小外接矩阵
    2. void Contour_external_minmatrix(Mat image){
    3. Mat gray,binary;
    4. cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
    5. GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
    6. threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
    7. //轮廓检测
    8. vector<vector<Point>> contours;//轮廓
    9. vector<Vec4i> hierarchy;//存放轮廓结构变量
    10. findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
    11. //寻找轮廓的外接矩阵
    12. for(int n=0;n<contours.size();n++) {
    13. //最小外接矩阵
    14. RotatedRect rrect= minAreaRect(contours[n]);
    15. Point2f points[4];
    16. rrect.points(points);//读取最小外接矩阵的四个顶点
    17. Point2f cpt=rrect.center;//最小外接矩阵的中心
    18. //绘制旋转矩阵与中心位置
    19. for(int i=0;i<4;i++){
    20. if(i==3){
    21. line(image,points[i],points[0],Scalar(0,0,255,255),2,8,0);
    22. break;
    23. }
    24. line(image,points[i],points[i+1],Scalar(0,0,255,255),2,8,0);
    25. }
    26. //绘制矩阵中心
    27. circle(image,cpt,4,Scalar(0,0,255,255),-1,8,0);
    28. }
    29. imwrite("/sdcard/DCIM/min.png",image);
    30. }

     轮廓外接最小矩形的结果:

     

    3.轮廓外接多边形approxPolyDP()

    void cv::approxPolyDP (InputArray curve,

    OutputArray approxCurve,

    double    epsilon,

    bool      closed

    • curve:输入轮廓像素点。
    • approxCurve:多边形逼近结果,以多边形顶点坐标的形式给出
    • epsilon:逼近的精度,即原始曲线和逼近曲线之间的最大距离。
    • closed:逼近曲线是否为封闭曲线的标志, true表示曲线封闭,即最后一个顶点与第一个顶点相连

    示例代码:

    1. void drawapp(Mat result,Mat img2){
    2. for(int i=0;i<result.rows;i++){
    3. //最后一个坐标点与第一个坐标点连接
    4. if(i==result.rows-1){
    5. Vec2i point1=result.at<Vec2i>(i);
    6. Vec2i point2=result.at<Vec2i>(0);
    7. line(img2,point1,point2,Scalar(0,0,255,255),4,8,0);
    8. break;
    9. }
    10. Vec2i point1=result.at<Vec2i>(i);
    11. Vec2i point2=result.at<Vec2i>(i+1);
    12. line(img2,point1,point2,Scalar(0,0,255,255),4,8,0);
    13. }
    14. }
    15. //轮廓多边形拟合
    16. void Contour_external_matrix(Mat image){
    17. Mat gray,binary;
    18. cvtColor(image,gray,COLOR_BGR2GRAY);//灰度化
    19. // GaussianBlur(gray,gray,Size(9,9),2,2);//滤波
    20. // threshold(gray,binary,170,255,THRESH_BINARY|THRESH_OTSU);//自适应二值化
    21. //轮廓的发现与绘制
    22. vector<vector<Point>> contours;//轮廓
    23. vector<Vec4i> hierarchy;//存放轮廓结构变量
    24. findContours(gray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
    25. //绘制多边形
    26. for(int n=0;n<contours.size();n++) {
    27. //用最小外接矩阵求取轮廓中心
    28. RotatedRect rrect= minAreaRect(contours[n]);
    29. Point2f center=rrect.center;//最小外接矩阵的中心
    30. circle(image,center,2,Scalar(0,0,255,255),2,8,0);
    31. Mat result;
    32. approxPolyDP(contours[n],result,4,true);//多边形拟合
    33. drawapp(result,image);
    34. }
    35. imwrite("/sdcard/DCIM/matrix.png",image);
    36. }

    多边形拟合的结果:

  • 相关阅读:
    人大金仓Windows下可以使用计划任务吗?创建完没有反应?
    Linux系统编程——总结初识Linux(常用命令、特点、常见操作系统)
    Django 4.x Overviewses 框架概述
    Java 工具库Hutool
    spring boot Mybatis Plus分页
    【JVM】MySQL驱动加载如何打破双亲委派机制
    从01背包说起(中)
    【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏应用于称重测力控制仪表
    springboot+vue+elementUI springboot地方废物回收机构管理系统-#毕业设计
    一个简单好用的localstorage组件store
  • 原文地址:https://blog.csdn.net/weixin_63357306/article/details/132790808