点云PCA主方向计算与坐标系对齐
// PCA:计算主方向 // 计算点云的质心 Eigen::Vector4f centroid; // 质心 pcl::compute3DCentroid(*cloud84, centroid); // 齐次坐标,(c0,c1,c2,1)
// 计算归一化协方差矩阵 Eigen::Matrix3f covariance; computeCovarianceMatrixNormalized(*cloud84, centroid, covariance);
// 计算主方向:特征向量和特征值 Eigen::SelfAdjointEigenSolverEigen::Matrix3f eigen_solver(covariance, Eigen::ComputeEigenvectors); Eigen::Matrix3f eigen_vectors = eigen_solver.eigenvectors();
// 校正主方向间垂直(特征向量方向: (e0, e1, e0 × e1) --- note: e0 × e1 = +/- e2) eigen_vectors.col(2) = eigen_vectors.col(0).cross(eigen_vectors.col(1));
// 转到参考坐标系,将点云主方向与参考坐标系的坐标轴进行对齐 Eigen::Matrix4f transformation(Eigen::Matrix4f::Identity()); transformation.block<3, 3>(0, 0) = eigen_vectors.transpose(); // R^(-1) = R^T transformation.block<3, 1>(0, 3) = -1.f * (transformation.block<3, 3>(0, 0) * centroid.head<3>()); // t^(-1) = -R^T * t
// 变换点云
pcl::PointCloud
// 沿参考坐标系坐标轴的边界值 PointType min_pt, max_pt; pcl::getMinMax3D(transformed_cloud, min_pt, max_pt);
// 形心 const Eigen::Vector3f mean_diag = 0.5f*(max_pt.getVector3fMap() + min_pt.getVector3fMap());
原文地址: https://www.cveoy.top/t/topic/qEfd 著作权归作者所有。请勿转载和采集!