在一个3D空间中给定N个点集,我正在尝试使用SVD和Eigen寻找最佳拟合平面。
我的算法如下:
1. 将数据点围绕(0,0,0)居中。 2. 形成点坐标的3xN矩阵。 3. 计算矩阵的SVD。 4. 将对应于最小奇异值的最小奇异向量设置为平面的法线。 5. 将平面到原点的距离设置为normal∙centroid。
我无法想出如何使用 Eigen's SVD Module来找到对应于点坐标矩阵的最小奇异值的最小奇异向量。
到目前为止,我有以下代码(算法的步骤1、2和5):
我的算法如下:
1. 将数据点围绕(0,0,0)居中。 2. 形成点坐标的3xN矩阵。 3. 计算矩阵的SVD。 4. 将对应于最小奇异值的最小奇异向量设置为平面的法线。 5. 将平面到原点的距离设置为normal∙centroid。
我无法想出如何使用 Eigen's SVD Module来找到对应于点坐标矩阵的最小奇异值的最小奇异向量。
到目前为止,我有以下代码(算法的步骤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);