生成逼近曲线:approxPolyDP 函数

该函数采用 Douglas-Peucker 算法(也称迭代终点拟合算法)。可以有效减少多边形曲线上点的数量,生成逼近曲线,简化后继操作。

经典的 Douglas-Peucker 算法描述如下:

  1. 在曲线首尾两点 A,B 之间连接一条直线 AB,该直线为曲线的弦;
  2. 得到曲线上离该直线段距离最大的点 C,计算其与 AB 的距离 d;
  3. 比较该距离与预先给定的阈值 threshold 的大小,如果小于 threshold,则该直线段作为曲线的近似,该段曲线处理完毕。
  4. 如果距离大于阈值,则用 C 将曲线分为两段 AC 和 BC ,并分别对两段曲线进行 1~3 的处理。
  5. 当所有曲线都处理完毕时,依次连接各个分割点形成的折线,即可以作为曲线的近似。

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

  • curve,输入的二维点集,可以为 vector 或 Mat 类型。
  • approxCurve,多边形逼近的结果,其类型应该和输入的二维点集类型一致。
  • epsilon,逼近的精度,设定的原始曲线与近似曲线之间的最大距离,即上文提到的的阈值。
  • closed,如果为真,则近似的曲线为封闭曲线(第一个顶点和最后一个顶点相连),否则,近似的曲线不封闭。

代码示例:

//作品《抽象的牛》
#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/6.jpg");
imshow("src", src); Mat gray, bin_img;
cvtColor(src, gray, COLOR_BGR2GRAY); //将原图转换为灰度图
imshow("gray", gray); //二值化
threshold(gray, bin_img, , , THRESH_BINARY_INV);
Mat kernel = getStructuringElement(MORPH_RECT, Size(, ));
morphologyEx(bin_img, bin_img, MORPH_CLOSE, kernel, Point(-, -), );//闭操作,先膨胀后腐蚀,消除小黑点
imshow("bin_img", bin_img); //寻找轮廓
vector<vector<Point> >contours;
findContours(bin_img, contours, RETR_TREE, CHAIN_APPROX_NONE); //生成逼近曲线
Mat dst = Mat::zeros(src.size(), src.type());
RNG rngs = { };
vector<vector<Point> >approx_contours(contours.size());//存放逼近曲线的数组
for (int i = ; i < contours.size(); i++) {
approxPolyDP(contours[i], approx_contours[i], , true);
Scalar colors = Scalar(rngs.uniform(, ), rngs.uniform(, ), rngs.uniform(, ));
drawContours(dst, approx_contours, i, colors, );
}
imshow("dst", dst); waitKey();
}

效果演示:

借鉴博客:https://blog.csdn.net/u013925378/article/details/86075230

opencv —— approxPolyDP 生成逼近曲线的更多相关文章

  1. [opencv]计算多边形逼近曲线的长度

    //利用曲线逼近,计算逼近曲线的长度 //首先创建一个逼近曲线 vector<Point2f> approx; approxPolyDP(contours[i], approx, 2, t ...

  2. FDDB人脸检测数据集 生成ROC曲线

    看了好多博客,踩了很多坑,终于把FDDB数据集的ROC曲线绘制出来了.记录一下. 环境:ubuntu18.04 1.数据集准备 去FDDB官网:http://vis-www.cs.umass.edu/ ...

  3. FFT初步代码分析和逼近曲线

    FFT:快速傅里叶变换 文章从两个方面来写,一个是FFT的基础知识,也就是将时域信号转换为频域信号,另一个是合成时域信号. 将时域信号转换为频域信号 代码来源于http://bigsec.net/b5 ...

  4. opencv:轮廓逼近与拟合

    轮廓逼近,本质上是减少编码点 拟合圆,生成最相似的圆或椭圆 #include <opencv2/opencv.hpp> #include <iostream> using na ...

  5. matlab练习程序(生成希尔伯特曲线)

    能够使用这样一条线遍历图像中所有的像素,不过这里没有这样做,而只是生成了这样一条曲线. 程序中h,w是最终图像的高和宽,n为希尔伯特曲线阶数. 这里如果n等于log2(h)或log2(w),则图像就全 ...

  6. 利用CMake和OpenCV源代码生成Visual Studio工程

    OpenCV1.0版本有windows,linux之分,笔者曾经一直使用Opencv1.0.这个版本在下载,安装之后,在 \OpenCV\_make文件夹下面已经存在了一个opencv.dsw的工程文 ...

  7. [opencv]approxDP多边形逼近获取四边形轮廓信息

    #include "opencv2/opencv.hpp" #include <iostream> #include <math.h> #include & ...

  8. python+opencv模拟生成运动模糊核

    Mark:https://www.cnblogs.com/wyh1993/p/7118559.html 效果非常的好

  9. ZedGraph怎样在生成曲线时随机生成不一样的颜色

    场景 在使用ZedGraph生成多条曲线时为了能区分曲线颜色,要求随机设置曲线颜色. 首先从System.Drawing.Color中获取所有颜色的对象的数组,然后将其顺序打乱随机排序,然后在生成曲线 ...

随机推荐

  1. 基于Bootstrap和Knockout.js的ASP.NET MVC开发实战

    之前在一家公司里用过Knockout,是easyui 和 Knockout结合 的.下面的这本应该不错. 目录 前言 第一部分入门指南 第1章MVC介绍 创建第一个项目 分析HomeControlle ...

  2. 网络io模型总结

    操作系统基本概念 首先来来说下操作系统,嗯,操作系统是计算机硬件的管理软件,是对计算机硬件的抽象,操作系统将应用程序分为用户态和内核态,例如驱动程序就位于内核态,而我们写的一般程序都是用户态,包括we ...

  3. Windows版Redis主从配置

    一.下载 从github上下载Redis的zip包,地址:https://github.com/MicrosoftArchive/redis/releases Redis本身不支持windows,这是 ...

  4. selenium + PhantomJS使用时 PhantomJS报错解决

    selenium + PhantomJS使用时 PhantomJS报错解决 在做动态网页爬虫时用到了selenium + PhantomJS,安装好之后运行时报错: UserWarning: Sele ...

  5. P4173 残缺的字符串(FFT字符串匹配)

    P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...

  6. alert弹出窗口,点击确认后关闭页面

    alert("点击确认后,关闭页面"); window.opener=null;window.top.open('','_self','');window.close(this);

  7. Leetcode 题目整理-6 Swap Nodes in Pairs & Remove Duplicates from Sorted Array

    24. Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For ...

  8. webpack入门系列2

    前面介绍了使用webpack做最基础的打包,接下来讲讲webpack的进阶. 1.使用 webpack 构建本地服务器: 想不想让你的浏览器监听你的代码的修改,并自动刷新显示修改后的结果,其实Webp ...

  9. Powershell下git中文乱码

    问题 使用git log查看提交历史, 发现中文的部分出现了乱码, 如图 解决方案 powershell中输入下面的命令 git config --global core.quotepath fals ...

  10. Spring配置 bean

    在 Spring 的 IOC 容器里配置 Bean <bean id="helloWorld" class="com.xiya.spring.beans.Hello ...