资源简介
B样条算法是对图像进行插值,其效果比一般的算法要好很多,此资源为源代码
代码片段和文件信息
#include
#include
#include
#include
#include“bspline.h“
#pragma comment (lib“cv210.lib“)
#pragma comment (lib“cxcore210.lib“)
#pragma comment (lib“highgui210.lib“)
void B_SPLine::InitMouseControlPoint(char *windowNameIplImage *img)
{
cvZero(img);
m_MouseParam.img=img;
m_MouseParam.pclass=this;
cvSetMouseCallback(windowNameMouseCallback(void *)&m_MouseParam);
}
void B_SPLine::DrawBSPLine(IplImage *img)
{
int xy;
unsigned char *p;
float u;
std::list::iterator iter;
cvZero(img);
ControlPoint result;
for(iter=m_ControlPoints.begin();iter!=m_ControlPoints.end();++iter)
{
p=(unsigned char *)(img->imageData+iter->point.x*img->nChannels+iter->point.y*img->widthStep);
*p=255;
}
for(u=0;u<1.0;u+=0.002)
{
GetBSPLine(u&result);
p=(unsigned char *)(img->imageData+result.point.x*img->nChannels+result.point.y*img->widthStep);
*p=128;
}
}
void B_SPLine::GetURegion(float u)
{
int iN;
N=m_ControlPoints.size();
m_DeltaU=1.0/N;
m_LowerBoundIdx=(int)(u/m_DeltaU);
m_LowerBound=m_LowerBoundIdx*m_DeltaU;
m_UpperBound=m_DeltaU+m_LowerBound;
}
bool B_SPLine::GetBSPLine(float u ControlPoint *result)
{
int i;
float *pN;
float tmpxtmpy;
std::list::iterator iter;
//获取u所在区间
GetURegion(u);
//清零结果结构体中的所有变量值
tmpx=0;
tmpy=0;
//根据u更新所有有关的B样条基函数
CalcNiku(u);
//计算B样条曲线对应于u的值
i=(m_K+1)*m_K/2;
pN=m_Niku+i;
if(m_LowerBoundIdx>=m_K)
{
for(iter=m_ControlPoints.begin()i=0;i {
;
}
for(i=0;i<=m_K;++i++iter)
{
tmpx+=iter->point.x*pN[m_K-i];
tmpy+=iter->point.y*pN[m_K-i];
//printf(“(%f%f)-“tmpxtmpy);
}
}
else
{
pN=pN+m_K;
for(iter=m_ControlPoints.end()i=m_K-m_LowerBoundIdx;i>0;i--)
{
--iter;
}
for(;iter!=m_ControlPoints.end();++iter)
{
tmpx+=iter->point.x**pN;
tmpy+=iter->point.y**pN;
--pN;
}
for(iter=m_ControlPoints.begin()i=0;i<=m_LowerBoundIdx;++iter++i)
{
tmpx+=iter->point.x**pN;
tmpy+=iter->point.y**pN;
--pN;
}
}
result->point.x=tmpx;
result->point.y=tmpy;
//getchar();
return TRUE;
}
void B_SPLine::CalcNiku(float u)
{
int kl;
float *pN;
float tmp1tmp2;
int N;
N=m_ControlPoints.size();
pN=m_Niku;
*pN=1;
++pN;
for(k=1;k<=m_K;++k)
{
for(l=0;l<=k;++l)
{
if(l==0)
{
tmp1=GetNiku(0k-1);
*pN=(u-m_LowerBound)/k/m_DeltaU*tmp1;
}
else if(l==k)
{
tmp1=GetNiku(l-1k-1);
*pN=(m_UpperBound-u)/k/m_DeltaU*tmp1;
}
else
{
tmp1=GetNiku(lk-1);
tmp2=GetNiku(l-1k-1);
*pN=(u-m_LowerBound+l*m_DeltaU)*tmp1+(m_UpperBound+(k-l)*m_DeltaU-u)*tmp2;
tmp1=k*m_DeltaU;
*pN/=tmp1;
}
//printf(“l--%dk--%d%f\n“lk*pN);
//getchar();
++pN;
}
}
}
B_SPLine::B_SPLine(int k)
{
int tmp;
m_K=k;
tmp=(k+1)*(k+2)/2;
m_Niku=new float[tmp
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-03-22 19:40 B样条\
文件 4072 2012-03-20 16:05 B样条\bspline.cpp
文件 1459 2012-03-17 09:55 B样条\bspline.h
文件 4022 2012-03-17 10:30 B样条\bspline.vcproj
文件 1427 2012-03-20 17:00 B样条\bspline.vcproj.WWW-F94CB748A28.Administrator.user
文件 6283 2012-03-20 16:53 B样条\bsplineinter.cpp
文件 647 2012-03-20 16:21 B样条\bsplineinter.h
文件 6032 2012-03-17 10:33 B样条\intFIFO.cpp
文件 831 2012-03-17 10:33 B样条\intfifo.h
文件 3125 2012-03-20 16:45 B样条\test.cpp
- 上一篇:OAUTH2.0+OpenLDAP技术框架
- 下一篇:flexsim邮局模拟仿真
相关资源
- B样条曲面代码
- Bezier曲面 Coons曲面 B样条曲面绘制(用
- 绘制Bezier曲面和B样条曲面
- 基于opencv的b样条实现
- 计算机辅助几何设计与非均匀有理B样
- 计算机图形学:B样条曲线生成算法
- 施法中_《计算机辅助几何设计与非均
- (转)B样条曲线反求控制点
- B样条的生成原理及实现
- 三次B样条曲线
- 《计算机辅助几何设计与非均匀有理
- B样条反求控制点绘制曲线
- 非均匀有理B样条.皮尔
- B样条曲线演示程序
- 三次四阶b样条插值算法Deboor算法)
- 北航B样条曲面程序计算机辅助几何设
- 机械臂关节空间 B 样条曲线轨迹规划
- 图形学Bezier曲线和B样条曲面
- b样条曲线、曲面绘制软件
- B样条曲线反求输出点列.rar
- B样条曲面源码
- 三次均匀B样条在工业机器人轨迹规划
- 计算机图形学源码DDA直线、中点直线
- B样条实现代码
- 基于OpenGL的B样条曲线曲面的绘制
- OpenGL的B样条、贝塞尔曲线和贝塞尔曲
- 机器人关节空间B样条轨迹优化设计
- 基于遗传算法B样条曲线优化在机器人
- 5次B样条曲线.rar
- B样条的实现
评论
共有 条评论