使用C ++将平面安装到3D点云

时间:2015-08-28 10:13:07

标签: c++ 3d linear algebra plane

我想将飞机安装到3D点云。我使用RANSAC方法,我从点云中采样几个点,计算平面并存储具有最小误差的平面。误差是点与平面之间的距离。我想用C ++做这个,使用Eigen。

到目前为止,我从点云中采样点并将数据居中。现在,我需要将飞机安装到采样点。我知道我需要解决Mx = 0,但我该怎么做?到目前为止我有M(我的样本),我想知道x(平面),这个拟合需要尽可能接近0。我不知道从哪里继续。我只有我的采样点,我需要更多的数据。我觉得所有信息都在那里,我忽视了一些事情。

1 个答案:

答案 0 :(得分:0)

从你的问题我假设你熟悉Ransac算法,所以我将免于你冗长的谈话。

在第一步中,您将采样三个随机点。您可以使用Random类,但选择不是真正随机的类通常可以获得更好的结果。对于这些点,您可以使用Hyperplane::Through简单地拟合平面。

在第二步中,重复地用大Hyperplane::absDistance划掉一些点,并对其余点进行最小二乘拟合。它可能看起来像这样:

Vector3f mu = mean(points);
Matrix3f covar = covariance(points, mu);
Vector3 normal = smallest_eigenvector(covar);
JacobiSVD<Matrix3f> svd(covariance, ComputeFullU);
Vector3f normal = svd.matrixU().col(2);
Hyperplane<float, 3> result(normal, mu);

不幸的是,函数meancovariance不是内置函数,但它们的编码非常简单。