【发布时间】:2017-01-15 04:08:15
【问题描述】:
给定 3D 空间中的一组 N 个点,我正在尝试使用 SVD 和 Eigen 找到最佳拟合平面。
我的算法是:
- 围绕 (0,0,0) 居中数据点。
- 形成点坐标的 3xN 矩阵。
- 计算矩阵的 SVD。
- 将最小奇异值对应的最小奇异向量设置为平面的法线。
- 将原点到平面的距离设置为正常∙质心。
我不知道如何使用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);
【问题讨论】:
-
到目前为止你尝试过什么代码?
-
在问题中添加了代码。
-
参见presentation 的幻灯片 97-99。
-
@ggael 我想使用 SVD,我读到在某些情况下应该更精确。