pcl::PointXYZRGB minPt, maxPt; pcl::getMinMax3D(*m_cloud, minPt, maxPt); pcl::PointCloudpcl::PointXYZRGB::Ptr cloud_rotated(new pcl::PointCloudpcl::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::SelfAdjointEigenSolverEigen::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 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); } } }

修改代码使得切片方向设为点云的主方向pclPointXYZRGB minPt maxPt;	pclgetMinMax3Dm_cloud minPt maxPt;	pclconsoleTicToc time;	timetic;	stdvectorintidx;	循环切片次数少于点的个数	切叶片	for int i = 0; i m_cloud-size; ++i			double maxY = -

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

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