因需要研究了一下贝赛尔曲线,并在opencv下实现. 可以修改控制点,连接多条曲线,修改曲线精度。
程序示例如下:
代码下载:
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 >
using namespace std;
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 ;
// 两个向量相加,p=p+q
CvPoint3D32f pointAdd(CvPoint3D32f p, CvPoint3D32f q) ... {
p.x += q.x; p.y += q.y; p.z += q.z;
return p;
}
// 向量和标量相乘p=c*p
CvPoint3D32f pointTimes( float c, CvPoint3D32f p) ... {
p.x *= c; p.y *= c; p.z *= c;
return p;
}
// 计算贝塞尔方程的值
// 变量u的范围在0-1之间
// P1*t^3 + P2*3*t^2*(1-t) + P3*3*t*(1-t)^2 + P4*(1-t)^3 = Pnew
CvPoint3D32f Bernstein( float u, CvPoint3D32f * p) ... {
CvPoint3D32f a, b, c, d, r;
a = pointTimes(pow(u,3), p[0]);
b = pointTimes(3*pow(u,2)*(1-u), p[1]);
c = pointTimes(3*u*pow((
//
#include " stdafx.h "
#include < iostream >
#include < string .h >
#include < cxcore.h >
#include < cv.h >
#include < highgui.h >
#include < fstream >
using namespace std;
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 ;
// 两个向量相加,p=p+q
CvPoint3D32f pointAdd(CvPoint3D32f p, CvPoint3D32f q) ... {
p.x += q.x; p.y += q.y; p.z += q.z;
return p;
}
// 向量和标量相乘p=c*p
CvPoint3D32f pointTimes( float c, CvPoint3D32f p) ... {
p.x *= c; p.y *= c; p.z *= c;
return p;
}
// 计算贝塞尔方程的值
// 变量u的范围在0-1之间
// P1*t^3 + P2*3*t^2*(1-t) + P3*3*t*(1-t)^2 + P4*(1-t)^3 = Pnew
CvPoint3D32f Bernstein( float u, CvPoint3D32f * p) ... {
CvPoint3D32f a, b, c, d, r;
a = pointTimes(pow(u,3), p[0]);
b = pointTimes(3*pow(u,2)*(1-u), p[1]);
c = pointTimes(3*u*pow((