如何使用点云库查找点云的主要成分和方向
how to find principal components and orientation of a point cloud using point cloud library
我有一个木块的点云。我找到了那个点云的质心。现在我正在尝试使用点云库查找主要组件和方向。下面是我试过的代码。有什么不明白的请指正。
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;
如果需要表示方向的旋转矩阵,我们可以选择物体体积分布最高的轴(归一化的第一特征向量——即与最大特征值相关联的特征向量)作为第一列矩阵。
对于矩阵的第 2 列,选择第二个特征向量,但您必须从中减去它在第一个特征向量上的投影,以便它与第一个特征向量正交。要计算它的投影,您可以使用点积 - 如果特征向量已经归一化,您可以只使用点积来计算要减去的向量的长度:所以将两个向量点积并将第一个向量乘以点积,然后从第一个特征向量中减去结果向量。
对于第 3 列,将只剩下一个选择 - 上面计算的两者的叉积。
我有一个木块的点云。我找到了那个点云的质心。现在我正在尝试使用点云库查找主要组件和方向。下面是我试过的代码。有什么不明白的请指正。
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;
如果需要表示方向的旋转矩阵,我们可以选择物体体积分布最高的轴(归一化的第一特征向量——即与最大特征值相关联的特征向量)作为第一列矩阵。
对于矩阵的第 2 列,选择第二个特征向量,但您必须从中减去它在第一个特征向量上的投影,以便它与第一个特征向量正交。要计算它的投影,您可以使用点积 - 如果特征向量已经归一化,您可以只使用点积来计算要减去的向量的长度:所以将两个向量点积并将第一个向量乘以点积,然后从第一个特征向量中减去结果向量。
对于第 3 列,将只剩下一个选择 - 上面计算的两者的叉积。