// 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 transformed_cloud; pcl::transformPointCloud(*cloud84, transformed_cloud, transformation);

// 沿参考坐标系坐标轴的边界值 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录