如何使用点云库查找点云的主成分和方向
Posted
技术标签:
【中文标题】如何使用点云库查找点云的主成分和方向【英文标题】:how to find principal components and orientation of a point cloud using point cloud library 【发布时间】:2015-02-24 16:34:56 【问题描述】:我有一个木块的点云。我找到了那个点云的质心。现在我正在尝试使用点云库查找主成分和方向。下面是我尝试过的代码。如果您还没有理解,请纠正我。
Eigen::Vector4f centroid;
Eigen::Matrix3f covariance_matrix;
// Extract the eigenvalues and eigenvectors
Eigen::Vector3f eigen_values;
Eigen::Matrix3f eigen_vectors;
pcl::compute3DCentroid(*cloud_filtered,cluster_indices,centroid);
// Compute the 3x3 covariance matrix
pcl::computeCovarianceMatrix (*cloud_filtered, centroid, covariance_matrix);
pcl::eigen33 (covariance_matrix, eigen_vectors, eigen_values);
std::cout << "centroid-x:"<<centroid[0]<<"centroid-y:"<<centroid[1]<<"centroid-z:"<<centroid[2]<<std::endl;
【问题讨论】:
看起来不错。有问题吗? 我想在cluster_indices中找到点云的方向。 最大特征值对应的特征向量应该近似为物体最大体积分布的方向,我假设这就是你想要的。您是否想以其他形式表达这种倾向? 是的,我想找到主成分相对于世界坐标的变换矩阵。 你想要的三个特征向量应该是独立的,你只需要它们正交以组成一个旋转矩阵(IIRC),所以我建议按原样采用第一个特征向量,从第二个特征向量第二个特征向量到第一个特征向量的投影,然后从第三个特征向量中减去它在由第一个和第二个特征向量形成的平面上的投影。我认为应该足够了。 【参考方案1】:如果您需要一个表示方向的旋转矩阵,我们可以选择对象的体积分布最高的轴(归一化的第一个特征向量 - 即与最大特征值相关的特征向量)作为矩阵的第一列.
对于矩阵的第 2 列,选择第 2 个特征向量,但您必须从中减去它在第 1 个特征向量上的投影,使其与第一个特征向量正交。要计算它的投影,您可以使用点积 - 如果特征向量已经标准化,您可以使用点积来计算要减去的向量的长度:所以点积两个向量并将第一个向量乘以点积,然后从第一个特征向量中减去得到的向量。
对于第 3 列,将只剩下一个选择 - 上面计算的两者的叉积。
【讨论】:
有没有办法将特征向量表示为轴?。 正如我在答案中所写,通过处理它们使它们成为正交,它们可以用作坐标系的轴。请随时提出更多问题,但如果我再次错过您的观点,可能需要更多详细信息。 请注意,旋转矩阵的列实际上是旋转坐标系的轴。 谢谢。您能否参考此链接并告诉我您是否有任何建议。 ***.com/q/28844865/2981361 对于这个问题,我建议你研究一下 PCLVisualizer 的 API。以上是关于如何使用点云库查找点云的主成分和方向的主要内容,如果未能解决你的问题,请参考以下文章
如何将点云库与 Unity Google tango 项目集成?