我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合

简介: 我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合

一、贝塞尔曲线基础知识


给一系列顶点,如果只是用直线将其中的各个点依次连接起来,最终形成一个折线图,这种很容易实现。但是现实中事物的变化往往具有连续的特性,即使是给定了一系列离散的点,基于以往的生活经验,人们也更愿意接受那种曲线连接的图。


计算机图形学中有一类很常用的曲线,俗称贝塞尔曲线。1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名是为贝塞尔曲线。很多程序语言都有实现贝塞尔曲线的API,而该曲线本身也拥有强大的近似其它曲线的能力,即使一条不能够胜任,那么分段的多条贝塞尔曲线也足够用来近似我们想绘制的曲线。


三阶贝塞尔曲线:


image.png


三阶贝塞尔曲线可以用一个三次函数描述,最多拥有两个拐点。用来做两点之间的曲线连接已经够用了。我们来看下它的直观形式:


image.png



二、我的软件截图

image.png




三、Qt贝塞尔绘制曲线的实现


《使用贝塞尔曲线绘制多点连接曲线》


https://www.jianshu.com/p/55099e3a2899


QT画贝塞尔曲线


https://blog.csdn.net/ryugu_rena/article/details/83241810


用贝塞尔曲线片段拟合点阵图中的曲线


https://github.com/Hzhiwei/CurveFit



四、扩展知识之多边形拟合


1、approxPolyDP


OpenCV findContours后的轮廓信息contours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似。approxPolyDP,它的主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。


原理图:对比之前黑点连线,之后蓝色连线:


image.png


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)当所有曲线都处理完毕时,依次连接各个分割点形成的折线,即可以作为曲线的近似。

image.png



为了考虑时间范围,还有另一种算法称为改良的Douglas-Peucker(TD-TR)。 TD-TR方法使用DP算法,而且还要考虑时间。 特别是,它用时间感知的同步欧氏距离(SED)代替了DP中使用的欧氏距离。


3、Douglas-Peucker C++算法实现


https://www.cnblogs.com/liugl7/p/7777660.html


https://blog.csdn.net/wjl_zyl_1314/article/details/109624604


https://download.csdn.net/download/www66net/8558729


相关文章
|
25天前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
29 2
|
1月前
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
52 0
|
2月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
OpenCV这么简单为啥不学——1.3、图像缩放resize函数
41 0
|
16天前
|
编解码 计算机视觉 Python
opencv 图像金字塔(python)
opencv 图像金字塔(python)
|
1月前
|
机器学习/深度学习 API vr&ar
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
Qt, OpenCV与OpenGL协同作战:图像处理与三维图形界面的完美结合
112 4
|
1月前
|
存储 计算机视觉
OpenCV(三十九):积分图像
OpenCV(三十九):积分图像
18 0
|
1月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
79 0
|
1月前
|
计算机视觉
OpenCV(三十):图像膨胀
OpenCV(三十):图像膨胀
21 0
|
1月前
|
计算机视觉
OpenCV(二十九):图像腐蚀
OpenCV(二十九):图像腐蚀
25 0
|
1月前
|
计算机视觉
OpenCV(二十七):图像距离变换
OpenCV(二十七):图像距离变换
20 0

热门文章

最新文章

推荐镜像

更多