[C++] opencv - approxPolyDP(多边形拟合)函数介绍和使用场景

27 篇文章 1 订阅

approxPolyDP()函数介绍

OpenCV中的approxPolyDP()函数用于对形状进行逼近,以减少多边形的顶点数,可以用于对图像轮廓点进行多边形拟合。

函数原型如下:

void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed );

其中,

curve是输入的点集,类型为InputArray,可以是Matvector<Point>等;

approxCurve是输出的点集,类型为OutputArray,也是Mat类型;

epsilon是精度,类型为double;

closed是一个布尔值,表示是否闭合多边形。

使用场景

在计算机视觉和图像处理中,approxPolyDP()函数用于对图像轮廓点可以进行多边形拟合,用于检测和识别形状。

使用案例

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 读取灰度图像
    Mat src = imread("./simple_chart.png");
    if (src.empty())
    {
        cout << "无法读取图像" << endl;
        return -1;
    }
    imshow("原图", src);
    waitKey(0);

    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    imshow("灰度图", gray);
    waitKey(0);

    // 二值化图像
    Mat binary;
    threshold(gray, binary, 50, 255, THRESH_BINARY);
    imshow("二值化图", binary);
    waitKey(0);

    // 查找轮廓
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    cout << "发现轮廓的数量:" << contours.size() << endl;

    // 绘制轮廓
    for (size_t i = 0; i < contours.size(); ++i)
    {
        auto contour = contours[i];
        vector<Point> approx;
        approxPolyDP(contour, approx, arcLength(contour, true) * 0.02, true);

        // 根据顶点数量判断形状
        // 如果为4,则为矩形或者正方形
        if (approx.size() == 4)
        {
            Rect rect = boundingRect(approx);
            rectangle(src, rect, Scalar(255, 255, 255), 2);
            // 判断是不是正方形
            if (((rect.width-rect.height)/(double) rect.height) <=0.02){
                cout << "这是正方形" << endl;
            }
        }
        // 如果为3,则为三角形
        else if(approx.size()== 3){
            drawContours(src, contours, i, Scalar(255, 255, 0), 2);
        }
        // 如果其他形状,比如圆,复杂多边形等
        else{
            drawContours(src, contours, i, Scalar(255, 0, 255), 2);
        }
    }

    // 显示结果
    imshow("轮廓绘制", src);
    waitKey(0);

    return 0;
}

原图:

 灰度图:

二值化图:

 轮廓图:

结论

在计算机视觉和图像处理中,approxPolyDP()函数用于对图像轮廓点可以进行多边形拟合,用于检测和识别形状。另外在图像分割、目标跟踪和机器人导航等领域,通过减少多边形的顶点数,可以提高算法的效率和准确性。

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值