我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
一、贝塞尔曲线基础知识
给一系列顶点,如果只是用直线将其中的各个点依次连接起来,最终形成一个折线图,这种很容易实现。但是现实中事物的变化往往具有连续的特性,即使是给定了一系列离散的点,基于以往的生活经验,人们也更愿意接受那种曲线连接的图。
计算机图形学中有一类很常用的曲线,俗称贝塞尔曲线。1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名是为贝塞尔曲线。很多程序语言都有实现贝塞尔曲线的API,而该曲线本身也拥有强大的近似其它曲线的能力,即使一条不能够胜任,那么分段的多条贝塞尔曲线也足够用来近似我们想绘制的曲线。
三阶贝塞尔曲线:
三阶贝塞尔曲线可以用一个三次函数描述,最多拥有两个拐点。用来做两点之间的曲线连接已经够用了。我们来看下它的直观形式:
二、我的软件截图
三、Qt贝塞尔绘制曲线的实现
《使用贝塞尔曲线绘制多点连接曲线》
使用贝塞尔曲线绘制多点连接曲线 - 简书
QT画贝塞尔曲线
QT画贝塞尔曲线_Ryugu的博客-CSDN博客_qt 贝塞尔曲线
用贝塞尔曲线片段拟合点阵图中的曲线
GitHub - Hzhiwei/CurveFit: 用贝塞尔曲线片段拟合点阵图中的曲线
四、扩展知识之多边形拟合
1、approxPolyDP
OpenCV findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似。approxPolyDP,它的主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。
原理图:对比之前黑点连线,之后蓝色连线:
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
参数详解;
InputArray curve:一般是由图像的轮廓点组成的点集
OutputArray approxCurve:表示输出的多边形点集
double epsilon:就是各个轮廓点之间最大距离数,这个参数表示的是精度,越小精度越高,因为表示的意思是是原始曲线与近似曲线之间的最大距离
bool closed:表示输出的多边形是否封闭
https://blog.csdn.net/qq_30815237/article/details/86901728
2、Douglas-Peucker Algorithm
在数字化时,要对曲线进行采样,即在曲线上取有限个点,将其变为折线,并且能够在一定程度
上保持原有的形状。
经典的Douglas-Peucker算法步骤如下(如下图):
(1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦;
(2)得到曲线上离该直线段距离最大的点C,计算其与AB的距离d;
(3)比较该距离与预先给定的阈值threshold的大小,如果小于threshold,则该直线段作为曲线的近似,该段曲线处理完毕。
(4)如果距离大于阈值,则用C将曲线分为两段AC和BC,并分别对两段取信进行1~3的处理。
(5)当所有曲线都处理完毕时,依次连接各个分割点形成的折线,即可以作为曲线的近似。
为了考虑时间范围,还有另一种算法称为改良的Douglas-Peucker(TD-TR)。 TD-TR方法使用DP算法,而且还要考虑时间。 特别是,它用时间感知的同步欧氏距离(SED)代替了DP中使用的欧氏距离。
3、Douglas-Peucker C++算法实现
轨迹压缩之Douglas-Peucker算法之C++实现 - 逸阳 - 博客园
轨迹数据压缩算法-经典Douglas-Peucker算法 c++实现_风去幽墨的博客-CSDN博客_轨迹压缩算法
Douglas-PeuckerVC++算法实现-C++代码类资源-CSDN下载
五、引申阅读
OpenCV库的拟合算子 approxPolyDP
Halcon库的拟合算子 gen_contour_nurbs_xld
Opencascade库的拟合算子 Geom2dAPI_PointsToBSpline
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合相关推荐
- OpenCV检测图像轮廓
轮廓只不过是图像中连接的曲线,或者图像中连通部分的边界,轮廓通常以图像中的边缘来计算,但是,边缘和轮廓的区别在于轮廓是闭合的,而边缘可以是任意的.边缘的概念局限于点及其邻域像素,轮廓将目标作为整体进行 ...
- OpenCV中图像轮廓检测
OpenCV中图像轮廓检测 通过之前的Canny方法可以得到图像的边界,但是我们无法得到边界的数学信息.所以就有了今天的图像轮廓检测. 在OpenCV中图像轮廓检测的API: findContours ...
- Python+OpenCV:图像轮廓
Python+OpenCV:图像轮廓 轮廓是什么? 轮廓可以简单地解释为一条连接所有连续点(沿边界)的曲线,具有相同的颜色和强度. 轮廓线是形状分析.目标检测和识别的重要工具. 为了获得更好的精度,可 ...
- opencv 利用图像轮廓函数填充圆环内部 图像轮廓函数应用小例子
实验: import cv2 as cv import numpy as np# 1.读入圆环 img = cv.imread('circle_ring.jpg') img_gray = cv.cvt ...
- opencv 绘制图像轮廓
图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用 ...
- 图像轮廓提取算法(Opencv基于C++实现)
Opencv图像轮廓提取 0. 实现结果如下: 1. 打开图像代码 2. 轮廓提取函数 3. 代码实现 本文主要实现了图像的轮廓提取,首先先给出直观的轮廓实现结果: 0. 实现结果如下: 1. 打开图 ...
- 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- 《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- 我的Qt作品(17)OpenCV畸变标定,针对单张圆点图片实现畸变校正
1.详情见我在论坛发的帖子:单张圆点图片实现畸变校正 http://www.ihalcon.com/read-17421.html 2.畸变校正和九点标定的实验结果,带来的精度提升: 视野范围400m ...
最新文章
- C++中const char*, string 与char*的转化
- GIt代码托管、Github Desktop和 Pycharm中代码的管理
- java父类shape_java父类为抽象类,子类构造方法传参
- python调用msf_MSF利用python反弹shell-Bypass AV
- 收下这份实操案例,还怕不会用Jmeter接口测试工具?!
- 学生选课系统 c语言
- NDCG、AUC介绍
- 三层交换机和链路聚合
- Android小说阅读器案例
- 微信小程序Demo大全
- tp5使用RabbitMQ的使用记录
- 图片提取文字很神奇?试试三步实现OCR!
- Lipschitz常数、Lipschitz条件
- ROSNOTE :Twist /cmd_vel (速度、调试)
- 很多APP都支持了 “本机号码一键登录”,知道是怎么实现么?
- 做了一个app,返回三国武将的排序网页,记录一下,省得以后找不到
- 3D或游戏画面卡顿的解决方法
- 拉拉米抢单发单系统源码+二开ui带视频介绍+ 放量功能
- hive编程指南笔记
- Mysql实战之快速填充序列维度表