首先默认你环境已经配置好了
运行环境为:vs2019 + pcl1.12.1 +win10
开始 实例 代码
加载库
#include <string>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/common/eigen.h>
#include <pcl/common/centroid.h>
#include <pcl/segmentation/sac_segmentation.h> //基于采样一致性分割的类的头文件
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/project_inliers.h> //投影滤波相关头文件
#include <pcl/search/search.h>//树搜索头文件
#include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件
#include <Eigen/Core>//包络框使用的
#include <Eigen/dense>//包络框使用的
#include <pcl/common/common.h>
#include <pcl/common/transforms.h>//包络框使用的
#include<time.h>
using PointT = pcl::PointXYZ;
主函数
void main()
{
// -------------------------------------------加载点云---------------------------------------------
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
if (pcl::io::loadPCDFile <PointT>("before.pcd", *cloud) == -1)
{
PCL_ERROR("Cloud reading failed.");
}
// Find the dominant direction
Eigen::Vector4f centroid;
Eigen::Matrix3f covariance_matrix;
pcl::compute3DCentroid(*cloud, centroid);
pcl::computeCovarianceMatrixNormalized(*cloud, centroid, covariance_matrix);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance_matrix, Eigen::ComputeEigenvectors);
Eigen::Vector3f eigenvalues = eigen_solver.eigenvalues();
Eigen::Matrix3f eigenvectors = eigen_solver.eigenvectors();
Eigen::Vector3f main_direction = eigenvectors.col(2);
// Calculate the rotation angle
Eigen::Vector3f z_axis(0.f, 0.f, 1.f);
float rotation_angle = -acos(main_direction.dot(z_axis) / (main_direction.norm() * z_axis.norm()));
// Calculate the rotation matrix
Eigen::Matrix4f rotation_matrix = Eigen::Matrix4f::Identity();
rotation_matrix.block<2, 2>(0, 0) << std::cos(rotation_angle), -std::sin(rotation_angle),
std::sin(rotation_angle), std::cos(rotation_angle);
// Apply the rotation matrix to the point cloud
pcl::transformPointCloud(*cloud, *cloud, rotation_matrix);
Move the point cloud to the origin
//Eigen::Vector4f centroid_new;
//pcl::compute3DCentroid(*cloud, centroid_new);
//Eigen::Affine3f transform = Eigen::Affine3f::Identity();
//transform.translation() << -centroid_new[0], -centroid_new[1], -centroid_new[2];
//pcl::transformPointCloud(*cloud, *cloud, transform);
pcl::io::savePCDFileASCII("after.pcd", *cloud);
}```