给定3D空间中的一组N点,我试图使用SVD和Eigen找到最合适的平面。
我的算法是:
我无法弄清楚如何使用Eigen的SVD模块查找与点坐标矩阵的最小奇异值相对应的最小奇异矢量。
到目前为止,我已经有了以下代码(算法的步骤1、2和5):
Eigen::Matrix<float, 3, 1> mean = points.rowwise().mean();
const Eigen::Matrix3Xf points_centered = points.colwise() - mean;
int setting = Eigen::ComputeThinU | Eigen::ComputeThinV;
Eigen::JacobiSVD<Eigen::Matrix3Xf> svd = points_centered.jacobiSvd(setting);
Eigen::Vector3d normal = **???**
double d = normal.dot(mean);
用表示U = svd.matrixU()
,矢量U.col(0)
与U.col(1)
定义平面的底面,U.col(2)
并且垂直于平面。
U.col(0)
还定义了最大标准偏差的方向。
即使您的点共面,也应使用标记ComputeFullU
而不是ComputeThinU
具有正确的尺寸。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句