|
发表于 2023-11-11 17:19:49
|
显示全部楼层
广东省深圳市
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/project_inliers.h>
#include <pcl/common/common.h>
int main()
{
// 假设你有一个点云 cloud,类型为 pcl::PointCloud<pcl::PointXYZ>,包含了你的点云数据
// 创建一个 PassThrough 过滤器,用于提取感兴趣区域
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z"); // 按照 Z 轴进行过滤
pass.setFilterLimits(0.0, 2.0); // 过滤 Z 值在 0 到 2 之间的点
pass.filter(*cloud_filtered);
// 创建一个分割对象,用于分割平面
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setMaxIterations(1000);
seg.setDistanceThreshold(0.01);
seg.setInputCloud(cloud_filtered);
seg.segment(*inliers, *coefficients);
// 通过投影将点云投影到平面上
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);
pcl::ProjectInliers<pcl::PointXYZ> proj;
proj.setModelType(pcl::SACMODEL_PLANE);
proj.setInputCloud(cloud_filtered);
proj.setModelCoefficients(coefficients);
proj.filter(*cloud_projected);
// 获取投影后的点云的最小和最大坐标
pcl::PointXYZ min_pt, max_pt;
pcl::getMinMax3D(*cloud_projected, min_pt, max_pt);
// 输出矩形四个角点的坐标
std::cout << "Min Point: " << min_pt << std::endl;
std::cout << "Max Point: " << max_pt << std::endl;
return 0;
}
|
|