首先感谢您的建议。
正如您对 PCA 和边界框所建议的那样,我创建了一个边界框,并且我还可以在 PCL 可视化工具中查看创建的框,现在在获得边界框之后,我的目标是将生成的 Cube 保存到单独的 PCD 文件以供进一步计算。
这是我用于生成边界框的代码,任何人都可以建议我如何将生成的 Cube 保存到单独的 PCD 文件中
int BoundingBox(pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr)
{
// compute principal direction
Eigen::Vector4f centroid;
pcl::compute3DCentroid(*point_cloud_ptr, centroid);
Eigen::Matrix3f covariance;
computeCovarianceMatrixNormalized(*point_cloud_ptr, centroid,covariance);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);
Eigen::Matrix3f eigDx = eigen_solver.eigenvectors();
eigDx.col(2) = eigDx.col(0).cross(eigDx.col(1));
// move the points to the that reference frame
Eigen::Matrix4f p2w(Eigen::Matrix4f::Identity());
p2w.block<3,3>(0,0) = eigDx.transpose();
p2w.block<3,1>(0,3) = -1.f * (p2w.block<3,3>(0,0) * centroid.head<3>());
pcl::PointCloud<pcl::PointXYZ> cPoints;
pcl::transformPointCloud(*point_cloud_ptr, cPoints, p2w);
pcl::PointXYZ min_pt, max_pt;
pcl::getMinMax3D(cPoints, min_pt, max_pt);
const Eigen::Vector3f mean_diag = 0.5f*(max_pt.getVector3fMap() + min_pt.getVector3fMap());
// final transform
const Eigen::Quaternionf qfinal(eigDx);
const Eigen::Vector3f tfinal = eigDx*mean_diag + centroid.head<3>();
// draw the cloud and the box
pcl::visualization::PCLVisualizer viewer;
viewer.addPointCloud(point_cloud_ptr);
viewer.addCube(tfinal, qfinal, max_pt.x - min_pt.x, max_pt.y - min_pt.y, max_pt.z - min_pt.z);
viewer.spin();
return(0);
}
任何建议都会有所帮助。
提前致谢