因需要研究了一下贝赛尔曲线,并在opencv下实现. 可以修改控制点,连接多条曲线,修改曲线精度。
程序示例如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/hardvb/131404/o_bezier.JPG)
代码下载:
opencv_share@163.com download
代码如下:
//
TrainingTools.cpp : 定义控制台应用程序的入口点。
//
#include
"
stdafx.h
"
#include
<
iostream
>
#include
<
string
.h
>
#include
<
cxcore.h
>
#include
<
cv.h
>
#include
<
highgui.h
>
#include
<
fstream
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
const
int
WW_MAX_MARK_COUNT
=
40
;
//
最大40个控制点
int
mark_count
=
4
;
int
conner_pt_index
=-
1
;
CvPoint3D32f Control_pts[WW_MAX_MARK_COUNT];
IplImage
*
image
=
0
;
//
原始图像
bool
is_showControlLines
=
true
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
两个向量相加,p=p+q
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
CvPoint3D32f pointAdd(CvPoint3D32f p, CvPoint3D32f q)
...
{
p.x += q.x; p.y += q.y; p.z += q.z;
return p;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
向量和标量相乘p=c*p
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
CvPoint3D32f pointTimes(
float
c, CvPoint3D32f p)
...
{
p.x *= c; p.y *= c; p.z *= c;
return p;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
计算贝塞尔方程的值
//
变量u的范围在0-1之间
//
P1*t^3 + P2*3*t^2*(1-t) + P3*3*t*(1-t)^2 + P4*(1-t)^3 = Pnew
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
CvPoint3D32f Bernstein(
float
u, CvPoint3D32f
*
p)
...
{
CvPoint3D32f a, b, c, d, r;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
a = pointTimes(pow(u,3), p[0]);
b = pointTimes(3*pow(u,2)*(1-u), p[1]);
c = pointTimes(3*u*pow((