PCL拟合平面和球面模型

1、拟合代码

  // created RandomSampleConsensus object and compute the appropriated model
  pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr
    model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ> (cloud));
  pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr
    model_p (new pcl::SampleConsensusModelPlane<pcl::PointXYZ> (cloud));

    pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_p);//实例化一个随机采样对象
    ransac.setDistanceThreshold (.01);//设置拟合阈值
    ransac.computeModel();//根据模型获得内点
    ransac.getInliers(inliers);//保存内点至inliers
  // copies all inliers of the model computed to another PointCloud
  pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *final);//根据inliers索引,将输入的点云cloud中的点挑选到final存放

2、全部代码

#include <iostream>
#include <pcl/console/parse.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/sample_consensus/sac_model_sphere.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

//定义一个可视化函数
boost::shared_ptr<pcl::visualization::PCLVisualizer>
simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud,pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud_in)
{
  // --------------------------------------------
  // -----Open 3D viewer and add point cloud-----
  // --------------------------------------------
  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
  int v1(0);
  int v2(0);

  viewer->createViewPort(0,0,0.5,1,v1);
  viewer->createViewPort(0.5,0,1,1,v2);
  viewer->setBackgroundColor (0, 0, 0,v1);
  viewer->setBackgroundColor(0,180,100,v2);
  viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud",v1);//显示传入的点云(结果)
  viewer->addPointCloud<pcl::PointXYZ>(cloud_in,"cloud_in",v2);
  viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud",v1);
  viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"cloud_in",v2);

  viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,233,0,0,"cloud_in",v2);//原始点云颜色为红色
  viewer->addCoordinateSystem (1.0);
  viewer->initCameraParameters ();
  return (viewer);
}

int
main(int argc, char** argv)
{
	srand(time(NULL));
  // initialize PointClouds
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointXYZ>::Ptr final (new pcl::PointCloud<pcl::PointXYZ>);

  // populate our PointCloud with points
  cloud->width    = 5000;
  cloud->height   = 1;
  cloud->is_dense = false;
  cloud->points.resize (cloud->width * cloud->height);
  for (size_t i = 0; i < cloud->points.size (); ++i)
  {
    if (pcl::console::find_argument (argc, argv, "-s") >= 0 || pcl::console::find_argument (argc, argv, "-sf") >= 0)
    {
      cloud->points[i].x =  rand () / (RAND_MAX + 1.0);
      cloud->points[i].y =  rand () / (RAND_MAX + 1.0);
      if (i % 5 == 0)
        cloud->points[i].z =  rand () / (RAND_MAX + 1.0);
      else if(i % 2 == 0)
        cloud->points[i].z =  sqrt( 1 - (cloud->points[i].x * cloud->points[i].x)
                                      - (cloud->points[i].y * cloud->points[i].y));
      else
        cloud->points[i].z =  - sqrt( 1 - (cloud->points[i].x * cloud->points[i].x)
                                        - (cloud->points[i].y * cloud->points[i].y));
    }
    else
    {
      cloud->points[i].x =  rand () / (RAND_MAX + 1.0);
      cloud->points[i].y =  rand () / (RAND_MAX + 1.0);
      if( i % 5 == 0)
        cloud->points[i].z = rand () / (RAND_MAX + 1.0);
      else
        cloud->points[i].z = -1 * (cloud->points[i].x + cloud->points[i].y);
    }
  }

  std::vector<int> inliers;

  // created RandomSampleConsensus object and compute the appropriated model
  pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr
    model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ> (cloud));
  pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr
    model_p (new pcl::SampleConsensusModelPlane<pcl::PointXYZ> (cloud));
  if(pcl::console::find_argument (argc, argv, "-f") >= 0)
  {
    pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_p);
    ransac.setDistanceThreshold (.01);
    ransac.computeModel();
    ransac.getInliers(inliers);
  }
  else if (pcl::console::find_argument (argc, argv, "-sf") >= 0 )
  {
    pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_s);
    ransac.setDistanceThreshold (0.008);
    ransac.computeModel();
    ransac.getInliers(inliers);//返回查找到的内点
  }

  std::cout<<"cloud_in: "<<cloud->size()<<std::endl;
  std::cout<<"inlier.size: "<<inliers.size()<<std::endl;

  // copies all inliers of the model computed to another PointCloud
  pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *final);//根据inliers索引,将输入的点云cloud中的点挑选到final存放

  std::cerr<<"final: "<<final->size()<<std::endl;
  // creates the visualization object and adds either our orignial cloud or all of the inliers
  // depending on the command line arguments specified.
  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
  if (pcl::console::find_argument (argc, argv, "-f") >= 0 || pcl::console::find_argument (argc, argv, "-sf") >= 0)
    viewer = simpleVis(final,cloud);
  else
    viewer = simpleVis(cloud,cloud);
  while (!viewer->wasStopped ())
  {
    viewer->spinOnce (100);
    boost::this_thread::sleep (boost::posix_time::microseconds (100000));
  }
  return 0;
 }

3、实例化(左边为拟合之后的结果,右边为原始点云数据)

拟合平面模型

拟合球面模型

 

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: PCL RANSAC(随机采样一致性)是一种在点云数据中进行平面拟合的算法。它广泛应用于三维重建、环境感知和机器人视觉等领域。 该算法的基本思想是通过随机采样一致性来找到与模型匹配的点集。具体步骤如下: 1. 随机选择一定数量的点,在点云中形成一个随机样本(seed)。 2. 根据选取的样本,计算平面模型的参数,例如平面法向量和点到平面的距离。 3. 对于点云中的每个点,计算其到模型的距离,并根据预先设定的阈值确定是否属于内点(inlier)。 4. 统计属于内点的个数,并根据内点数来评估模型拟合度。 5. 重复前面的步骤多次,选择内点最多的模型作为最佳拟合结果。 6. 可选:在内点集合中重新进行平面拟合来提高拟合精度。 PCL RANSAC拟合平面的优势在于其鲁棒性和可靠性。由于对于模型参数的评估采用了统计学方法,可以有效地排除离群点的影响,并找到最佳拟合平面。 需要注意的是,RANSAC算法的参数设置对于拟合结果具有较大的影响,例如随机抽样的次数、内点阈值或距离阈值等,需要根据具体应用场景进行合理的调整。 ### 回答2: pcl ransac(Random Sample Consensus)是一种用于拟合平面的算法。它是一种迭代的、随机的方法,用于从点云数据中找到最佳的拟合平面。该算法的基本思想是随机地选择一些数据点,并利用这些点来拟合一个平面模型。然后,通过计算每个数据点到这个模型的距离,将距离小于一个设定阈值的点作为内点分组,将距离大于阈值的点作为外点删除。接着,根据内点重新拟合一个平面模型,并计算该模型的内点数。重复这个过程,直到找到了一个满足条件的最佳平面模型或达到了设定的迭代次数。 通过使用pcl ransac拟合平面c,我们可以从给定的点云中找到一个最佳的平面模型c。这个模型的特征以及模型参数可以帮助我们理解点云数据的几何结构。拟合平面c可以用于进行点云的分割、地面提取、物体识别等应用。在拟合平面c的过程中,我们可以通过调整阈值来控制拟合的精度,通过调整迭代次数来控制算法的效率。 总结来说,pcl ransac拟合平面c是一种基于随机采样的迭代算法,用于从给定的点云数据中找到一个满足条件的最佳平面模型c。这个算法可以帮助我们分析点云数据的几何结构,并应用于各种场景中,如机器人感知、三维重建等。 ### 回答3: pcl ransac 是一种点云平面拟合算法,用于从点云数据中找到最佳拟合平面。对于给定的点云数据集,PCL RANSAC 首先随机从中选择一个点作为初始种子点,并根据设定的阈值确定该平面上的内点。 然后,利用最小二乘方法计算该平面的法向量和拟合误差。接着,算法通过将其他点投影到该拟合平面,计算投影点到实际点之间的距离,将距离小于设定阈值的点判定为内点,并重新估计拟合平面的参数。 该过程迭代多次,直到达到设定的迭代次数或者内点个数不再增加。最终,PCL RANSAC 输出最佳拟合平面的参数和内点。 这种平面拟合方法在点云数据处理中有着广泛的应用。例如,在三维重建、物体识别和环境建模等领域,需要从点云中提取平面特征。 PCL RANSAC 算法通过随机抽样和迭代过程,能够在存在噪声和离群点的情况下,仍然获得准确可靠的平面拟合结果。它能够克服传统方法对数据噪声敏感和对初始种子点选择的依赖性的问题。 总之,PCL RANSAC 是一种高效可靠的点云平面拟合算法,能够从点云数据中提取平面特征,并广泛应用于三维图像处理和计算机视觉中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech沉思录

点赞加投币,感谢您的资瓷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值