#include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/ply_io.h> #include <pcl/features/normal_3d.h> #include <pcl/features/principal_curvatures.h> #include <pcl/registration/transforms.h>

int main() { // 加载xyzrgb点云 pcl::PointCloudpcl::PointXYZRGB::Ptr cloudPtr3(new pcl::PointCloudpcl::PointXYZRGB()); pcl::io::loadPLYFile("xyzrgb.ply", *cloudPtr3);

// 将xyzrgb点云复制到xyz点云中
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudXYZ(new pcl::PointCloud<pcl::PointXYZ>());
pcl::copyPointCloud(*cloudPtr3, *cloudXYZ);

// 计算主方向
pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr principalCurvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>());
pcl::NormalEstimation<pcl::PointXYZ, pcl::PrincipalCurvatures> ne;
ne.setInputCloud(cloudXYZ);
ne.setSearchMethod(pcl::search::KdTree<pcl::PointXYZ>::Ptr(new pcl::search::KdTree<pcl::PointXYZ>()));
ne.compute(*principalCurvatures);

// 获取主方向的角度
Eigen::Vector3f mainDirection = Eigen::Map<Eigen::Vector3f>(principalCurvatures->points[0].principal_curvature);
mainDirection.normalize();
double angle = std::acos(mainDirection.dot(Eigen::Vector3f::UnitY()));

// 计算旋转矩阵
Eigen::Matrix4f transform = Eigen::Matrix4f::Identity();
Eigen::Affine3f rotation(Eigen::AngleAxisf(angle, Eigen::Vector3f::UnitX()));
transform.block<3, 3>(0, 0) = rotation.matrix();

// 将点云应用旋转矩阵
pcl::PointCloud<pcl::PointXYZRGB>::Ptr rotatedCloud(new pcl::PointCloud<pcl::PointXYZRGB>());
pcl::transformPointCloud(*cloudPtr3, *rotatedCloud, transform);

// 保存旋转后的点云
pcl::io::savePLYFileASCII("rotatedCloud.ply", *rotatedCloud);

return 0;
将下列代码补充为一段完整的程序 将xyzrgb点云复制到xyz点云中	pclPointCloudpclPointXYZPtr cloudXYZnew pclPointCloudpclPointXYZ;	pclcopyPointCloudcloudPtr3 cloudXYZ;	 计算主方向	pclPointCloudpclPrincipalCurvaturesPtr principalCurvatu

原文地址: http://www.cveoy.top/t/topic/iFf9 著作权归作者所有。请勿转载和采集!

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