1 三次Beizer曲线方程介绍

Beizer曲线的一些特性这里不再赘述,大家可以去网上查看一些资料,很详细。最近用到轮廓拟合,所以用三次Beizer曲线效果还可以,有插值和近似拟合(插值就是曲线过点,近似拟合则不过点),就学习了一下。我是做的Beizer曲线插值,插值和近视拟合无非就是控制点选取不一样。
Beizer总方程为
∑PiKni(t)\sum P_{i}K_{i}^{n}(t) (1),
三次Beizer曲线方程:
Bn(t)=P0(1−t)3+3P1t(1−t)2+3P2t2(1−t)+P3t3,tϵ[0,1]B_{n}(t)=P_{0}(1-t)^{3}+3P_{1}t(1-t)^{2}+3P_{2}t^{2}(1-t)+P_{3}t^{3},t\epsilon [0,1] (2),
这里的P1P_1和P2P_2就是所谓的控制点A、B点。关于控制点AB的求法很多种,我是采用参数设定法构造控制点,思路我是参考百度文库一篇文章,“确定控制点文章链接”。文章写的很详细,对于闭合轮廓的话就想象成一个循环,第0个点的前两个点为n-1和n-2,第n-1个点的后两个点为0和1,文章很好理解。对于参数a和b,通常都是0.25,但我看别人论文中有a=0.125,b=0.05,拟合出来的效果很接近真实曲线,所以我也是采用这个参数。

2 代码实现

上述讲了三次Beizer曲线方程,用在轮廓拟合中怎么实现呢。当然,你先得找到轮廓中的特征点,然后根据两个相邻的特征点拟合成一段三次Beizer曲线,控制点AB是借助周围几个点得到的。思路大概就是这样的。下面讲一下具体步骤。
###2.1 得到控制点AB
控制点AB方程在刚才那篇百度文科文章中有,所以直接根据那个方程来编写代码,下面是我求控制点AB的代码,很简单,大家有需要的可以参考。

//求得控制点AB
void ControlAB(double *Xi,double *Yi, double *Ai_x,double *Ai_y, double *Bi_x,double *Bi_y,int n, double a, double b,int boundType)
{if(boundType==1){Ai_x[0]=Xi[0]+(Xi[1]-Xi[n-1])*a;Ai_y[0]=Yi[0]+(Yi[1]-Yi[n-1])*a;Bi_x[n-2]=Xi[n-1]-(Xi[0]-Xi[n-2])*b;Bi_y[n-2]=Yi[n-1]-(Yi[0]-Yi[n-2])*b;Ai_x[n-1]=Xi[n-1]+(Xi[0]-Xi[n-2])*a;Ai_y[n-1]=Yi[n-1]+(Yi[0]-Yi[n-2])*a;Bi_x[n-1]=Xi[0]-(Xi[1]-Xi[n-1])*b;Bi_y[n-1]=Yi[0]-(Yi[1]-Yi[n-1])*b;}for(int i=1;i<n-1;i++){Ai_x[i]=Xi[i]+(Xi[i+1]-Xi[i-1])*a;Ai_y[i]=Yi[i]+(Yi[i+1]-Yi[i-1])*a;}for(int i=0;i<n-2;i++){Bi_x[i]=Xi[i+1]-(Xi[i+2]-Xi[i])*b;Bi_y[i]=Yi[i+1]-(Yi[i+2]-Yi[i])*b;}
}

代码注意:代码不要瞎贴,这里有些自定义数组,Xi、Yi是点的x、y。

###2.2 拟合曲线生成与绘制
求得AB控制点,可以将P1P_1、P2P_2、A和B代入方程(2)中,得到P1P_1和P2P_2中间的一段三次Beizer曲线方程,就拟合出来了。这时需要看到效果。我用的是C++的MFC画出来的曲线,当然也可以Python,Python一搜有很多例子,网上可以荡到的。我画二维曲线用的是MFC,大家可以参考我的博客“MFC绘制二维曲线”,给个我实验拟合出来的闭合轮廓,其中参数a=0.125,b=0.05。
原轮廓
拟合轮廓

可以看到,拟合效果还是不错的。图中的小黑点是我给的特征点,MFC画出来就是这个样子。

3 总结

三次Beizer曲线拟合算法还是很简单的,主要是控制点的选取,还有最关键的特征点选取。特征点是最基本的。当然Beizer也有一些不足之处,对于非闭合轮廓的情况拟合情况不是很理想,这就需要其他的曲线拟合,我会再发一篇B样条曲线拟合算法的。

三次Beizer曲线拟合算法相关推荐

  1. 三次B样条曲线拟合算法

    1 三次B样条曲线方程 B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程.这里会一次介绍两种拟 ...

  2. 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现

    近期,因为要实现经过多个控制点的曲线拟合,研究起了曲线拟合算法.综合搜索到的资料,发现Bezier曲线拟合算法是一种相对较容易实现.且拟合的效果较好的算法.关于Bezier曲线原理,请参照(Bezie ...

  3. 最小二乘法线性拟合和2次曲线拟合算法

    最近由于项目要求,应用了最小二乘法线性拟合和2次曲线拟合算法,现总结如下: 最小二乘法线性拟合应用已有的采样时间点,再现这些点所描述的线性变化,即求出一个线性方程y=ax+b(这个算法的主要问题也就是 ...

  4. 算法:三种简单排序算法

    排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...

  5. 时间序列挖掘-预测算法-三次指数平滑法(Holt-Winters)——三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息...

    from:http://www.cnblogs.com/kemaswill/archive/2013/04/01/2993583.html 在时间序列中,我们需要基于该时间序列当前已有的数据来预测其在 ...

  6. 递归_三要素_基础算法必备

    递归_三要素_基础算法必备 目录 第一要素:明确函数作用 第二要素:递归结束条件 第三要素:函数等价关系 第一要素:明确函数作用 对于递归,我觉得很重要的一个事就是,这个函数的功能是什么,他要完成什么 ...

  7. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF

    数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF 一.概述 参考:特征点匹配+特征检测方法汇总 ORB的全称是Oriented ...

  8. 分割文本_PSENet、PANNet、DBNet三个文本检测算法异同

    点击蓝字关注我们 这三个文本检测算法都是segment base算法,通过由下而上的方式,先对text进行segment,然后再根据segment text,计算出text的instance PSEN ...

  9. 计算机控制pid控制实验,计算机控制实验三数字PID调节器算法的研究

    计算机控制技术实验报告 学院:********** 班级:********** 姓名:****** 学号:**********实验三 数字PID调节器算法的研究 实验项目名称:数字PID调节器算法的研 ...

最新文章

  1. 2021年大数据Kafka(九):kafka消息存储及查询机制原理
  2. java接口构建英雄属性_Java开发学习心得(三):项目结构
  3. 云数据库MongoDB全面支持3.4版本,支持多存储引擎
  4. 基于Java学院网页的搜索引擎设计和实现
  5. 两日公开课:伯克利深度强化学习训练营 | 视频+PPT
  6. MVC中将list转化成json 并处理时间格式
  7. my97中文乱码问题
  8. 如何快速辨识四位数字贴片电阻阻值
  9. python谐音梗_谐 音 梗 生 成 器
  10. ADAS软件系统测试入门指南
  11. 段地址x16+偏移地址=物理地址的本质含义
  12. TI 蓝牙4.0芯片 cc2540
  13. AI 作画《NBA球星动漫头像》| 用stable diffusion生成
  14. 拼多多“超级农货节”收官 阳光玫瑰、琯溪蜜柚上榜“超级水果”
  15. 电子元件-TVS与肖特基二极管
  16. PaddlePaddle课程学习第一周笔记
  17. 综述|基于深度学习的目标检测(一)
  18. 低功耗虚拟服务器,功耗只有10W 技嘉推出超低功耗小主机平台
  19. Go语言相关书籍推荐(从入门到放弃)
  20. Programming Languages PartA Week2学习笔记——SML基本语法

热门文章

  1. 纸上谈兵还是惊天谋划,百度神灯到底会不会显灵?
  2. mysql 查看登陆记录_查看用户登录记录
  3. Android音视频合成工具-MediaMuxer
  4. 周末动物园旅游计划书
  5. 操作无法完成 计算机名不正确,操作无法完成. 键入的打印机名称不正确,或者指定的打印机未连接到服务器...
  6. 浮动按钮、扇形按钮、EasyThouch
  7. 七夕到了!不会写代码?一样可以给女朋友建个网站
  8. 基于MDKA5D31-EK_T70开发板的QT示例-demo01:LEDTimer
  9. 基于python的微博_基于python编写的微博应用
  10. java入门-W3(K81-K143)