我想将飞机安装到3D点云。我使用RANSAC方法,我从点云中采样几个点,计算平面并存储具有最小误差的平面。误差是点与平面之间的距离。我想用C ++做这个,使用Eigen。
到目前为止,我从点云中采样点并将数据居中。现在,我需要将飞机安装到采样点。我知道我需要解决Mx = 0,但我该怎么做?到目前为止我有M(我的样本),我想知道x(平面),这个拟合需要尽可能接近0。我不知道从哪里继续。我只有我的采样点,我需要更多的数据。我觉得所有信息都在那里,我忽视了一些事情。
答案 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);
不幸的是,函数mean
和covariance
不是内置函数,但它们的编码非常简单。