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

news/2025/1/15 13:55:14/

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.ppmy.cn/news/1526223.html

相关文章

基于Python的自然语言处理系列(9):使用TorchText与预训练词嵌入进行新闻分类

在前一篇文章中&#xff0c;我们展示了如何使用TorchText和RNN进行新闻分类。在这篇文章中&#xff0c;我们将改进之前的模型&#xff0c;通过使用预训练词嵌入、优化器的更改、正交初始化以及打包填充序列的技巧&#xff0c;提升模型的学习效率和效果。 1. 改进方向 提高模型…

计算机网络八股总结

这里写目录标题 网络模型划分&#xff08;五层和七层&#xff09;及每一层的功能五层网络模型七层网络模型&#xff08;OSI模型&#xff09; 三次握手和四次挥手具体过程及原因三次握手四次挥手 TCP/IP协议组成UDP协议与TCP/IP协议的区别Http协议相关知识网络地址&#xff0c;子…

HarmonyOS开发之使用PhotoViewPicker(图库选择器)保存图片

一&#xff1a;效果图 二&#xff1a;添加依赖 import fs from ohos.file.fs;//文件管理 import picker from ohos.file.picker//选择器 三&#xff1a;下载&#xff0c;保存图片的实现 // 下载图片imgUrldownloadAndSaveImage(imgUrl: string) {http.createHttp().request(…

笔记共享平台|基于Java+vue的读书笔记共享平台系统(源码+数据库+文档)

笔记共享平台|读书笔记共享平台系统 目录 基于Javavue的读书笔记共享平台系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

林草湿地址、导出echart为word

2.导出 // 导出exportDoc () {this.loading truelet arrRefs [this.$refs.endChart, this.$refs.processChart, this.$refs.officeEndChart]setTimeout(() > {Promise.all(arrRefs.map((canvasDom) > {return this.html2canvasHandle(canvasDom)})).then(res > {let…

系统架构设计师 需求分析篇一

&#x1f4d8; 结构化分析SA 思想 自顶向下&#xff1a;像剥洋葱一样&#xff0c;层层深入&#xff0c;大问题拆成小问题&#xff0c;再拆成更小的问题。 核心模型 数据字典 &#x1f4d4;&#xff1a;记录数据元素的点点滴滴&#xff0c;从属性到使用方式&#xff0c;无所…

音视频开发常见的开源项目汇总

FFmpeg 地址&#xff1a;https://ffmpeg.org/介绍&#xff1a;FFmpeg 是一个非常强大的开源多媒体框架&#xff0c;它可以用来处理视频和音频文件。它支持多种格式的转换、编码、解码、转码、流处理等。FFmpeg 包括了 libavformat、libavcodec、libavutil、libswscale、libpos…

实时监控分析广告数据跳转统计平台源码

广告跳转实时分析页面统计系统&#xff0c;可选择生成html页面样式&#xff0c;可自定义设置页面域名后缀&#xff0c;可指定跳转指定网址&#xff0c; 可记录单个页面的访问记录&#xff0c;可对生成的单个链接进行备注&#xff0c;自定义等待时间进行跳转。 源码下载&#…