void Example::get_pca(pcl::PointCloud<PointType>::Ptr cloud)
{
size_t vn = cloud->size();
float radius = 0.5;
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
kdtree.setInputCloud(cloud);
#pragma omp parallel
{
#pragma omp for
for (int i = 0; i < vn; i++)
{
// Neighbors within radius search
std::vector<int> IdxRadiusSearch;
std::vector<float> RadiusSquaredDistance;
PointType searchPoint = cloud->at(i);
kdtree.radiusSearch(searchPoint, radius, IdxRadiusSearch, RadiusSquaredDistance);
// radius cloud
pcl::PointCloud<PointType>::Ptr k_nei_cloud(new pcl::PointCloud<PointType>);
for (size_t j = 0; j < IdxRadiusSearch.size(); j++)
{
PointType point_knn;
point_knn.x = cloud->at(IdxRadiusSearch[j]).x;
point_knn.y = cloud->at(IdxRadiusSearch[j]).y;
point_knn.z = cloud->at(IdxRadiusSearch[j]).z;
k_nei_cloud->push_back(point_knn);
}
/ input neighbors cloud, compute minimum variance
Eigen::Vector4f pcaCentroid;
pcl::compute3DCentroid(*k_nei_cloud, pcaCentroid);
Eigen::Matrix3f covariance;
pcl::computeCovarianceMatrixNormalized(*k_nei_cloud, pcaCentroid, covariance);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);
Eigen::Matrix3f eigenVectorsPCA = eigen_solver.eigenvectors();
Eigen::Vector3f eigenValuesPCA = eigen_solver.eigenvalues();
}
}
}
PCL 求解点云的PCA
最新推荐文章于 2024-07-21 18:03:32 发布
这段代码展示了如何在PCL(Point Cloud Library)中使用KdTree进行邻域搜索,并基于搜索结果计算PCA(主成分分析)。首先,设置搜索半径,然后对每个点进行邻域查找,找到邻域内的点并构建新的点云。接着,计算邻域点云的3D质心和协方差矩阵,进一步求解PCA得到特征向量和特征值。这段代码主要用于点云数据的降维和特征提取。
摘要由CSDN通过智能技术生成