当前位置: 首页 > article >正文

C++:opencv多边形逼近二值图轮廓--cv::approxPolyDP

cv::approxPolyDP 是 OpenCV 中一个用于多边形逼近的函数。它通过 Douglas-Peucker 算法将复杂的轮廓简化为更少的点,这在图像处理和计算机视觉中非常有用。例如,简化的轮廓可以帮助提高形状分析和轮廓检测的效率。

函数原型

void cv::approxPolyDP(
    const cv::InputArray& curve, 
    cv::OutputArray& approxCurve, 
    double epsilon, 
    bool closed
);

参数解释

  1. curve:

    • 类型: cv::InputArray
    • 描述: 输入的轮廓或曲线,通常是由 cv::findContours 函数返回的点集。它包含了一系列的点,表示一个轮廓或曲线。
  2. approxCurve:

    • 类型: cv::OutputArray
    • 描述: 输出的近似轮廓。函数将处理后的近似多边形存储在这个参数中。它将被填充为简化后的点集。
  3. epsilon:

    • 类型: double
    • 描述: 逼近精度的控制参数,表示允许的最大误差。它是原始轮廓到近似多边形的最大距离。epsilon 值越小,逼近的多边形越接近原始轮廓;epsilon 值越大,逼近的多边形越粗糙。
    • 计算方式: epsilon 通常是轮廓周长的一个比例,如 0.01 * cv::arcLength(curve, true),其中 0.01 是一个示例比例,实际应用中可以根据需求调整。
  4. closed:

    • 类型: bool
    • 描述: 指定轮廓是否闭合。如果 true,函数将假定轮廓是闭合的,即首尾相连;如果 false,函数将假定轮廓是不闭合的。

函数功能

cv::approxPolyDP 使用 Douglas-Peucker 算法对输入的轮廓进行多边形逼近,简化轮廓的点集,减少点的数量。这个函数常用于:

  • 轮廓简化: 将复杂的轮廓简化为更少的点,以便于进一步分析和处理。
  • 形状识别: 简化轮廓可以帮助识别和分析图像中的几何形状。
  • 数据压缩: 减少点的数量,有助于减少数据量,提高处理速度。

示例代码

以下是一个示例,展示如何使用 cv::approxPolyDP 简化一个轮廓:

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

int main() {
    // 创建一个示例轮廓(例如,一个复杂的多边形)
    std::vector<cv::Point> contour = {
        cv::Point(0, 0),
        cv::Point(10, 0),
        cv::Point(10, 10),
        cv::Point(5, 15),
        cv::Point(0, 10)
    };

    // 将轮廓转换为 cv::Mat 类型
    cv::Mat contourMat(contour);

    // 用于存储近似轮廓
    std::vector<cv::Point> approxCurve;

    // 计算 epsilon,设定为轮廓长度的 10%
    double epsilon = 0.1 * cv::arcLength(contourMat, true);

    // 执行多边形逼近
    cv::approxPolyDP(contourMat, approxCurve, epsilon, true);

    // 输出结果
    std::cout << "Original contour size: " << contour.size() << std::endl;
    std::cout << "Approximated contour size: " << approxCurve.size() << std::endl;

    // 打印近似轮廓的点
    for (const auto& point : approxCurve) {
        std::cout << "(" << point.x << ", " << point.y << ") ";
    }
    std::cout << std::endl;

    return 0;
}

解释

  1. 创建轮廓:

    • 示例中创建了一个多边形轮廓,表示一个简单的复杂形状。
  2. 计算 epsilon:

    • epsilon 设置为轮廓周长的 10%,控制多边形逼近的精度。这个值可以根据实际需求进行调整。
  3. 调用 cv::approxPolyDP:

    • 使用 cv::approxPolyDP 进行轮廓简化,将轮廓简化为更少的点,并存储在 approxCurve 中。
  4. 输出:

    • 打印原始轮廓和简化后的轮廓的点数,以及简化后的轮廓点坐标,以展示简化效果。

总结

  • 功能: cv::approxPolyDP 用于对轮廓进行多边形逼近,简化轮廓的点集。
  • epsilon 参数: 控制逼近精度的误差容忍度,影响轮廓简化的详细程度。
  • 应用: 适用于轮廓简化、形状识别和数据压缩等任务,提高图像处理的效率和准确性。

通过调整 epsilonclosed 参数,可以灵活地处理不同类型的轮廓和应用场景。


http://www.kler.cn/news/306486.html

相关文章:

  • Java集合进阶--双列集合
  • R与机器学习系列|15.可解释的机器学习算法(Interpretable Machine Learning)(下)
  • HarmonyOS开发5.0【rcp网络请求】
  • ChatGPT+2:修订初始AI安全性和超级智能假设
  • L298N电机驱动方案简介
  • JAVA:Nginx(轻量级的Web服务器、反向代理服务器)--(1)
  • JAVA学习-练习试用Java实现“串联所有单词的子串”
  • 物联网——USART协议
  • 揭开OpenAI草莓模型神秘面纱——重塑大语言模型的逻辑能力
  • np.argpartition 是 NumPy 库中的一个非常有用的函数,具体用法如下:
  • 力扣周赛:第415场周赛
  • 黑神话悟空+云技术,游戏新体验!
  • Using OpenAI API from Firebase Cloud Functions in flutter app
  • uniapp(H5)设置反向代理,设置成功后页面报错
  • 前端网络请求库:Axios
  • C++初阶学习——探索STL奥秘——vector的模拟实现
  • 20Kg载重30分钟续航多旋翼无人机技术详解
  • 微服务下功能权限与数据权限的设计与实现
  • 差分进化算法(DE算法)求解实例---旅行商问题 (TSP)
  • C语言自定义类型-联合与枚举
  • 无人机视角下落水救援检测数据集
  • Vue学习:props验证的一个小细节“Prop 名字格式”
  • 本专题大纲
  • golang学习笔记16——golang部署与运维全攻略
  • Java高级Day42-Class类
  • Linux——应用层自定义协议与序列化
  • docker 学习笔记
  • 【详细原理】蒙特卡洛树搜索
  • 财富通公司开发洗车小程序有哪些用处?
  • 通过load->model()加载数据模型:在爬虫中实现动态数据处理