C++代码:使用PCL库计算点云主方向及特征值
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/principal_curvatures.h>
#include <pcl/io/pcd_io.h>
#include
int main() { // 读取点云数据 pcl::PointCloudpcl::PointXYZRGB::Ptr cloudg(new pcl::PointCloudpcl::PointXYZRGB); pcl::io::loadPCDFilepcl::PointXYZRGB('point_cloud.pcd', *cloudg);
// 计算法线
pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
ne.setInputCloud(cloudg);
pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setKSearch(10);
ne.compute(*cloud_normals);
// 计算主曲率和法线
pcl::PrincipalCurvaturesEstimation<pcl::PointXYZRGB, pcl::Normal, pcl::PrincipalCurvatures> pc;
pc.setInputCloud(cloudg);
pc.setInputNormals(cloud_normals);
pc.setSearchMethod(tree);
pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr cloud_curvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>);
pc.setRadiusSearch(0.03);
pc.compute(*cloud_curvatures);
// 提取最大的前三个特征值和对应的特征向量
std::vector<float> curvatures;
std::vector<Eigen::Vector3f> principal_dirs;
for (size_t i = 0; i < cloud_curvatures->size(); ++i) {
pcl::PrincipalCurvatures pc = cloud_curvatures->points[i];
curvatures.push_back(pc.pc1);
principal_dirs.push_back(pc.principal_curvature_axis);
}
// 输出最大的前三个特征值和对应的特征向量
std::cout << 'Top 3 Eigenvalues: ';
for (int i = 0; i < 3; ++i) {
std::cout << curvatures[i] << ' ';
}
std::cout << std::endl;
std::cout << 'Top 3 Eigenvectors: ' << std::endl;
for (int i = 0; i < 3; ++i) {
std::cout << principal_dirs[i].transpose() << std::endl;
}
return 0;
}
请注意将'point_cloud.pcd'替换为您要加载的点云文件的路径。此代码首先计算点云的法线,然后使用法线计算主曲率和主方向。最后,它提取最大的前三个特征值和对应的特征向量,并将其输出到控制台。
原文地址: https://www.cveoy.top/t/topic/qDwQ 著作权归作者所有。请勿转载和采集!