PCL 点云切片:基于主方向的优化方法
pcl::PointXYZRGB minPt, maxPt;
pcl::getMinMax3D(*m_cloud, minPt, maxPt);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_rotated(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::copyPointCloud(*m_cloud, *cloud_rotated);
// 计算点云的主方向
Eigen::Vector4f centroid;
pcl::compute3DCentroid(*m_cloud, centroid);
Eigen::Matrix3f covariance;
pcl::computeCovarianceMatrixNormalized(*m_cloud, centroid, covariance);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);
Eigen::Matrix3f eigen_vectors = eigen_solver.eigenvectors();
eigen_vectors.col(2) = eigen_vectors.col(0).cross(eigen_vectors.col(1));
// 将点云旋转到主方向
Eigen::Matrix4f rotation_matrix = Eigen::Matrix4f::Identity();
rotation_matrix.block<3, 3>(0, 0) = eigen_vectors.transpose();
pcl::transformPointCloud(*m_cloud, *cloud_rotated, rotation_matrix);
pcl::console::TicToc time;
time.tic();
std::vector<int> idx;
// 循环切片,次数少于点的个数
// 切叶片
for (int i = 0; i < cloud_rotated->size(); ++i)
{
double minY = -0.168;
if (cloud_rotated->points[i].y >= minY && cloud_rotated->points[i].y <= maxPt.y && (cloud_rotated->points[i].x <= -0.001 || cloud_rotated->points[i].x >= 0.049))
{
int index = floor((cloud_rotated->points[i].x - minPt.x) / m_dPlatform);
float sliceMin = minPt.x + index * m_dPlatform;
if ((cloud_rotated->points[i].x >= sliceMin) && (cloud_rotated->points[i].x < sliceMin + m_Delta))
{
idx.push_back(i);
}
}
}
本文介绍了一种优化点云切片方法,通过计算点云主方向并进行旋转,将切片方向设置为点云的主方向,提高切片效率和精度。具体步骤如下:
- 计算点云的主方向:使用 PCL 库中的
compute3DCentroid和computeCovarianceMatrixNormalized函数计算点云的质心和协方差矩阵,并使用SelfAdjointEigenSolver计算协方差矩阵的特征向量,其中特征向量最大的方向即为主方向。 - 将点云旋转到主方向:构建一个旋转矩阵,将点云旋转到主方向。
- 按照主方向进行切片:根据旋转后的点云坐标进行切片,并保存切片结果。
通过这种方法,可以将切片方向与点云本身的方向一致,避免了由于方向不一致造成的切片效率低下和精度不足的问题。
该方法适用于各种点云数据,尤其适合于具有明显主方向的点云数据,例如道路、管道等。
原文地址: http://www.cveoy.top/t/topic/dUw2 著作权归作者所有。请勿转载和采集!