最小二乘法简解及空间直线拟合

通常我们在对一些数据进行直线,圆,圆柱,圆球等规则几何体进行拟合时,需要用到最小二乘法,只需要使其平方差最小,即可得到相应几何体的数学表达式。
一、最小二乘法
例如一组数据F={(X1,Y1),(X2,Y2),(X3,Y3)…,(Xn,Yn)},需要通过这组数据得到一条直线,设该条直线为:y=ax+b;使得(ax+b)的输出尽可能接近,从而使得预测值和真实值之间的方差最小,可以用下式表达:
E=(aX1+b-Y1)+(aX2+b-Y2)+(aX3+b-Y3)+.……+(aXn+b-Yn)
此时,如果使得E的值最小,即可到未知数a,b的值。
在这里插入图片描述
从公式中可以知晓Xi,Yi是已经量,只有a,b是未知量,即对其进行偏导,可以求得E最小时a,b的值。
对a求偏导:
最小二乘法简解及空间直线拟合_第1张图片
对b求偏导:
最小二乘法简解及空间直线拟合_第2张图片
最终得到2个二元一次方程,形成方程组,进行消元,求得a,b的值。
二、PCL中最小二乘法拟合点云直线源码
int fitLine(pcl::PointCloudpcl::PointXYZ::Ptr m_pPointCloud)
{

if (m_pPointCloud->points.empty())
{
	return 2;
}

pcl::ModelCoefficients::Ptr coefficients4(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers4(new pcl::PointIndices);
pcl::SACSegmentation seg4;
seg4.setOptimizeCoefficients(true);
seg4.setModelType(pcl::SACMODEL_LINE);
seg4.setMethodType(pcl::SAC_LMEDS);
seg4.setDistanceThreshold(distanceTolerance);
//输入点云
seg4.setInputCloud(m_pPointCloud);
//分割点云
seg4.segment(*inliers4, *coefficients4);
if (inliers4->indices.size() != 0)
{

	//提取直线
	pcl::ExtractIndices extract4;
	extract4.setInputCloud(m_pPointCloud);
	extract4.setIndices(inliers4);
	extract4.setNegative(false);
	extract4.filter(*m_pValidatePointCloud);
	return 0;
}
else
{
	return 1;
}

}
代码中有的参数是写在了头文件中,需要自己手动添加。

你可能感兴趣的:(最小二乘法简解及空间直线拟合)