1. 原理简述
我们知道主成分分析会得到特征值、特征向量,最大的特征值及其对应的特征向量则为主成分,表示数据分布的主方向。 最小特征值对应的特征向量则可以认为是空间点云的法向量。
2. 代码实现
//in_cloud为点云,center为点云质心
Eigen::Vector3d normal(const PCLCloudPtr& in_cloud, const Eigen::Vector3d& center)
{double xx = 0, xy = 0, xz = 0, yy = 0, yz = 0, zz = 0;std::size_t cld_sz = in_cloud->points.size();// 去中心化for (std::size_t i = 0; i < cld_sz; i++){xx += (in_cloud->points.at(i).x - center.x()) * (in_cloud->points.at(i).x - center.x());xy += (in_cloud->points.at(i).x - center.x()) * (in_cloud->points.at(i).y - center.y());xz += (in_cloud->points.at(i).x - center.x()) * (in_cloud->points.at(i).z - center.z());yy += (in_cloud->points.at(i).y - center.y()) * (in_cloud->points.at(i).y - center.y());yz += (in_cloud->points.at(i).y - center.y()) * (in_cloud-&g