基于RANSAC算法的贝赛尔曲线拟合


随机生成五百个点作为初始数据,根据RANSAC算法,对初始数据进行拟合,寻找一条最能表示这五百个点的贝赛尔曲线。
资源截图
代码片段和文件信息
// BezierFitting.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h“
#include 
#include 
#include 
#include 
#include 
#include 
#include 


using namespace std;
int divs = 50; // 贝塞尔曲线粗细程度
IplImage *image;
int main(int argc char* argv[])
{
CvSize image_size = cvSize(10241024);
image = cvCreateImage(image_sizeIPL_DEPTH_8U3);
cvZero(image);
cvNamedWindow(“imageShow“0);

//随机生成500个点,x值在[3060]y值在[01024]
vector pointList;
srand((unsigned int) time(NULL));
for (int i = 0;i < 500;i++)
{

int x = rand() %30 + 30; 
int y = rand() %1024;
CvPoint pt = cvPoint(xy);
pointList.push_back(pt);
}

uchar *data = (uchar *)image->imageData;
int step = image->widthStep / sizeof(uchar);
vector::iterator iter;
for(iter = pointList.begin();iter != pointList.end();iter++)
{
int x = (*iter).x;
int y = (*iter).y;
data[y * step + x * image->nChannels + 0] = 0;
data[y * step + x * image->nChannels + 1] = 255;
data[y * step + x * image->nChannels + 2] = 0;
}


int BestScore = 0;
int iterTimes = 100;//迭代次数
CvPoint controlPoints[4];//最终控制点
CvPoint samplePoints[4];//迭代过程随机验证的控制点
int countInliners = 0; //内联点数

int k = 1;

srand((unsigned int) time(NULL));
int x = 0;
for (int i = 0;i < iterTimes;i++)
{
//随机选取四个点作为控制点
//srand(time(0));

srand(k);
samplePoints[0] = pointList[rand() %20];
srand(k++);
samplePoints[1] = pointList[rand() %230];
srand(k++);
samplePoints[2] = pointList[rand() %230 + 250];
srand(k++);
samplePoints[3] = pointList[rand() %20 + 480];

//判断点到曲线距离,计算内联点数
countInliners = 0;
//vector::iterator iter;
float dis = 0;//点到曲线距离



// x = samplePoints[0].x;
int x0 = samplePoints[0].x;
int y0 = samplePoints[0].y;
int x1 = samplePoints[1].x;
int y1 = samplePoints[1].y;
int x2 = samplePoints[2].x;
int y2 = samplePoints[2].y;
int x3 = samplePoints[3].x;
int y3 = samplePoints[3].y;

for (iter = pointList.begin();iter != pointList.end();iter++)
{
 float d = (float)((*iter).y - (*iter).x);
 bool Isinliner = false;
 for (float t = 0;t < 1;t += (1/divs))
 {
 float dTemp = (y0 - x0) * pow(t3) + (y1 - x1) * 3 * pow(t2) * (1 - t) + (y2 - x2) * 3 * t * pow((1 - t)2) + (y3 - x3) * pow((1 - t)3);
 if (abs(d - dTemp) < 10)
 {
 Isinliner = true;
 break;
 }
 }
 if (Isinliner)
 {
 countInliners++;
 }
}

if (countInliners > 400)  //如果内联点数超出预期值,则直接跳出,否则选择最优的
{
*controlPoints = *samplePoints;
/*for (int k = 0;k < 4;k++)
{
controlPoints[k] = samplePoints[k];
}*/
break;
}

if (countInliners > BestScore)
{
BestScore = countInliners;
*controlPoints = *samplePoints;
/*for (int k = 0;k < 4;k++)
{
controlPoints[k] = samplePoints[k];
}*/
}
}

cvShowImage(“imageShow“image);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-06-09 16:42  BezierFitting
     目录           0  2014-06-05 15:13  BezierFittingBezierFitting
     文件        3639  2014-06-09 11:30  BezierFittingBezierFittingBezierFitting.cpp
     文件        5095  2014-06-09 16:42  BezierFittingBezierFittingBezierFitting.vcxproj
     文件        1454  2014-06-09 16:42  BezierFittingBezierFittingBezierFitting.vcxproj.filters
     文件         143  2014-06-05 10:49  BezierFittingBezierFittingBezierFitting.vcxproj.user
     目录           0  2014-06-09 11:06  BezierFittingBezierFittingDebug
     文件         406  2014-06-05 15:13  BezierFittingBezierFittingDebugBezierFitting.exe.embed.manifest
     文件         472  2014-06-05 15:13  BezierFittingBezierFittingDebugBezierFitting.exe.embed.manifest.res
     文件         381  2014-06-09 11:06  BezierFittingBezierFittingDebugBezierFitting.exe.intermediate.manifest
     文件          57  2014-06-09 11:06  BezierFittingBezierFittingDebugBezierFitting.lastbuildstate
     文件        3089  2014-06-09 11:06  BezierFittingBezierFittingDebugBezierFitting.log
     文件      235642  2014-06-09 11:06  BezierFittingBezierFittingDebugBezierFitting.obj
     文件     1179648  2014-06-05 15:13  BezierFittingBezierFittingDebugBezierFitting.pch
     文件         713  2014-06-05 15:13  BezierFittingBezierFittingDebugBezierFitting.vcxprojResolveAssemblyReference.cache
     文件           0  2014-06-05 15:13  BezierFittingBezierFittingDebugBezierFitting.write.1.tlog
     文件         216  2014-06-05 15:13  BezierFittingBezierFittingDebugBezierFitting_manifest.rc
     文件       21432  2014-06-09 11:06  BezierFittingBezierFittingDebugCL.read.1.tlog
     文件         832  2014-06-09 11:06  BezierFittingBezierFittingDebugCL.write.1.tlog
     文件        1506  2014-06-09 11:06  BezierFittingBezierFittingDebugcl.command.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink-cvtres.read.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink-cvtres.write.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1792-cvtres.read.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1792-cvtres.write.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1792.read.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1792.write.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1996-cvtres.read.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1996-cvtres.write.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1996.read.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.1996.write.1.tlog
     文件           2  2014-06-09 11:06  BezierFittingBezierFittingDebuglink.4008-cvtres.read.1.tlog
............此处省略37个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)