资源简介
这个是很经典的RANSAC算法实现,里面改成了中文注释
代码片段和文件信息
#include
#include “LineParamEstimator.h“
LineParamEstimator::LineParamEstimator(double delta) : m_deltaSquared(delta*delta) {}
/*****************************************************************************/
/*
* Compute the line parameters [n_xn_ya_xa_y]
* 通过输入的两点来确定所在直线,采用法线向量的方式来表示,以兼容平行或垂直的情况
* 其中n_xn_y为归一化后,与原点构成的法线向量,a_xa_y为直线上任意一点
*/
/*****************************************************************************/ */
void LineParamEstimator::estimate(std::vector &data std::vector ¶meters)
{
parameters.clear();
if(data.size()<2)
return;
double nx = data[1]->y - data[0]->y;
double ny = data[0]->x - data[1]->x;// 原始直线的斜率为K,则法线的斜率为-1/k
double norm = sqrt(nx*nx + ny*ny);
parameters.push_back(nx/norm);
parameters.push_back(ny/norm);
parameters.push_back(data[0]->x);
parameters.push_back(data[0]->y);
}
/*****************************************************************************/
/*
* Compute the line parameters [n_xn_ya_xa_y]
* 使用最小二乘法,从输入点中拟合出确定直线模型的所需参量
*/
void LineParamEstimator::leastSquaresEstimate(std::vector &data
std::vector ¶meters)
{
double meanX meanY nx ny norm;
double covMat11 covMat12 covMat21 covMat22; // The entries of the symmetric covarinace matrix
int i dataSize = data.size();
parameters.clear();
if(data.size()<2)
return;
meanX = meanY = 0.0;
covMat11 = covMat12 = covMat21 = covMat22 = 0;
for(i=0; i meanX +=data[i]->x;
meanY +=data[i]->y;
covMat11 +=data[i]->x * data[i]->x;
covMat12 +=data[i]->x * data[i]->y;
covMat22 +=data[i]->y * data[i]->y;
}
meanX/=dataSize;
meanY/=dataSize;
covMat11 -= dataSize*meanX*meanX;
covMat12 -= dataSize*meanX*meanY;
covMat22 -= dataSize*meanY*meanY;
covMat21 = covMat12;
if(covMat11<1e-12) {
nx = 1.0;
ny = 0.0;
}
else { //lamda1 is the largest eigen-value of the covariance matrix
//and is used to compute the eigne-vector corresponding to the smallest
//eigenvalue which isn‘t computed explicitly.
double lamda1 = (covMat11 + covMat22 + sqrt((covMat11-covMat22)*(covMat11-covMat22) + 4*covMat12*covMat12)) / 2.0;
nx = -covMat12;
ny = lamda1 - covMat22;
norm = sqrt(nx*nx + ny*ny);
nx/=norm;
ny/=norm;
}
parameters.push_back(nx);
parameters.push_back(ny);
parameters.push_back(meanX);
parameters.push_back(meanY);
}
/*****************************************************************************/
/*
* Given the line parameters [n_xn_ya_xa_y] check if
* [n_x n_y] dot [data.x-a_x data.y-a_y] < m_delta
* 通过与已知法线的点乘结果,确定待测点与已知直线的匹配程度;结果越小则越符合,为
* 零则表明点在直线上
*/
bool LineParamEstimator::agree(std::vector ¶meters Point2D &data)
{
double signedDistance = parameters[0]*(data.x-parameters[2]) + parameters[1]*(data.y-parameters[3]);
return ((signedDistance*signed
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2014-05-30 10:51 Ziv Yaniv\
目录 0 2014-05-29 15:17 Ziv Yaniv\Debug\
文件 11706 2014-05-29 15:17 Ziv Yaniv\Debug\BuildLog.htm
文件 2048 2014-05-29 15:16 Ziv Yaniv\Debug\RANSAC.exe.em
文件 93184 2014-05-29 15:17 Ziv Yaniv\Debug\vc90.idb
文件 135168 2014-05-29 15:17 Ziv Yaniv\Debug\vc90.pdb
文件 5102 2014-05-30 10:22 Ziv Yaniv\LineParamEstimator.cpp
文件 2693 2004-05-12 16:15 Ziv Yaniv\LineParamEstimator.h
文件 1765 2004-05-12 16:17 Ziv Yaniv\ParameterEsitmator.h
文件 22 2004-05-11 19:13 Ziv Yaniv\Point2D.cpp
文件 442 2014-05-29 15:17 Ziv Yaniv\Point2D.h
文件 4725 2004-05-11 20:20 Ziv Yaniv\RANSAC.dsp
文件 535 2004-05-11 19:34 Ziv Yaniv\RANSAC.dsw
文件 1854464 2014-05-30 14:32 Ziv Yaniv\RANSAC.ncb
文件 53760 2004-05-12 17:05 Ziv Yaniv\RANSAC.opt
文件 246 2004-05-12 16:30 Ziv Yaniv\RANSAC.plg
文件 877 2014-05-30 10:51 Ziv Yaniv\RANSAC.sln
文件 18944 2014-05-30 14:32 Ziv Yaniv\RANSAC.suo
文件 6242 2014-05-29 15:16 Ziv Yaniv\RANSAC.vcproj
文件 1409 2014-05-30 14:32 Ziv Yaniv\RANSAC.vcproj.ZQL-PC.ZQL.user
文件 13096 2004-05-12 16:18 Ziv Yaniv\Ransac.h
文件 3970 2014-05-30 10:51 Ziv Yaniv\RansacExample.cpp
文件 1819 2004-05-12 17:04 Ziv Yaniv\Readme
文件 286 2004-05-12 15:31 Ziv Yaniv\Unix_Makefile
- 上一篇:操作系统实习-快速文件系统
- 下一篇:MemoryMonitor(内存监测)
评论
共有 条评论