查找点云的x,y,z方向的极值(调用pcl::getMinMax3D函数)

本文介绍了如何在pcl库中利用getMinMax3D函数找到点云数据在x,y,z轴上的最小值和最大值。通过代码示例展示了函数的使用方法,并验证了结果与cloudcompare软件的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pcl查找点云的x,y,z方向的极值

函数介绍

这是pcl中getMinMax3D的模板类实现。实际应用中直接调用即可。

template <typename PointT> inline void
pcl::getMinMax3D (const pcl::PointCloud<PointT> &cloud, PointT &min_pt, PointT &max_pt)
{
   
   
  Eigen::Array4f min_p, max_p;
  min_p.setConstant (FLT_MAX);
  max_p.setConstant (-FLT_MAX);

  // If the data is dense, we don't need to check for NaN
  if (cloud.is_dense)
  {
   
   
    for (size_t i = 0; i < cloud.points.size (); ++i)
    {
   
   
      pcl::Array4fMapConst pt = cloud.points[i].getArray4fMap 
// 2. RANSAC直线拟合 pcl::SampleConsensusModelLine<PointT>::Ptr model( new pcl::SampleConsensusModelLine<PointT>(cloud)); pcl::RandomSampleConsensus<PointT> ransac(model); ransac.setDistanceThreshold(0.01); ransac.computeModel(); // 提取直线参数 Eigen::VectorXf coeffs; ransac.getModelCoefficients(coeffs); Eigen::Vector3f line_point = coeffs.head<3>(); Eigen::Vector3f line_dir = coeffs.segment<3>(3).normalized(); if (line_dir.x() < 0) { // 若方向向量指向X负方向 line_dir *= -1; // 反转方向向量 //line_point = line_point + line_dir * coeffs[6]; // 调整直线基点(关键!) } // 3. 找到原始点云x最小值点 PointT min_x_point = cloud->points[0]; for (const auto& p : *cloud) { if (p.x < min_x_point.x) min_x_point = p; } // 将x最小值点投影到直线上 Eigen::Vector3f vec = min_x_point - line_point; float t = vec.dot(line_dir) / line_dir.squaredNorm(); // 垂直投影参数t Eigen::Vector3f start_point = line_point + t * line_dir; //float t = (min_x_point.x - line_point.x()) / line_dir.x(); //Eigen::Vector3f start_point = line_point + t * line_dir; // 找到原始点云的两个端点(这里假设为x最小和最大,可能需要更准确的方法) PointT max_x_point = min_x_point; for (const auto& point : *cloud) { if (point.x > max_x_point.x) { max_x_point = point; } } // 计算总长度 float total_length = pcl::euclideanDistance(min_x_point, max_x_point); float step = total_length / (cloud->size() - 1); // 5. 生成新点云 pcl::PointCloud<PointT>::Ptr new_cloud(new pcl::PointCloud<PointT>); for (size_t i=0; i<cloud->size(); ++i) { Eigen::Vector3f new_p = start_point + i * step * line_dir; new_cloud->push_back(PointT(new_p.x(), new_p.y(), new_p.z())); } 请改成python,请读取原始pcd直线点云文件,进行ransac直线拟合形成的新的直线方程,该方程有中心点和方向向量,然后找到原始点云最小的x值,带入直线方程,得到一个点,这时空间直线方程也可以用这个点加方向向量表示,再由这个点向x增大的方向沿直线平移长度,每次平移的长度等于原始的pcd直线点云两个端点的距离除以所有点数量减一,平移所有点数量减一次。最后会产生和原始pcd相同数量的点云坐标,保存为新的pcd文件
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值