PCL教程指南-点云变化检测

PCL教程指南-Spatial change detection on unorganized point cloud data(点云变化检测)

  • 官方原文档
  • 基于八叉树结构对两组点云检查区别即变化检测。
  • 代码注释解读,扩展内容
#include <pcl/point_cloud.h>
#include <pcl/octree/octree_pointcloud_changedetector.h>

#include <iostream>
#include <vector>
#include <ctime>

int
main (int argc, char** argv)
{
//按照时间设置随机种子值
  srand ((unsigned int) time (NULL));

  // 八叉树体素分辨率
  float resolution = 32.0f;

  //变化检测类
  pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree (resolution);

  pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA (new pcl::PointCloud<pcl::PointXYZ> );

  // 生成128个点的cloudA
  cloudA->width = 128;
  cloudA->height = 1;
  cloudA->points.resize (cloudA->width * cloudA->height);

  for (std::size_t i = 0; i < cloudA->size (); ++i)
  {
    (*cloudA)[i].x = 64.0f * rand () / (RAND_MAX + 1.0f);
    (*cloudA)[i].y = 64.0f * rand () / (RAND_MAX + 1.0f);
    (*cloudA)[i].z = 64.0f * rand () / (RAND_MAX + 1.0f);
  }

  // 构建八叉树结构
  octree.setInputCloud (cloudA);
  octree.addPointsFromInputCloud ();

  //切换缓冲区,仍然保留原有数据
  octree.switchBuffers ();

  pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB (new pcl::PointCloud<pcl::PointXYZ> );
   
  // 生成128个点的cloudB 
  cloudB->width = 128;
  cloudB->height = 1;
  cloudB->points.resize (cloudB->width * cloudB->height);

  for (std::size_t i = 0; i < cloudB->size (); ++i)
  {
    (*cloudB)[i].x = 64.0f * rand () / (RAND_MAX + 1.0f);
    (*cloudB)[i].y = 64.0f * rand () / (RAND_MAX + 1.0f);
    (*cloudB)[i].z = 64.0f * rand () / (RAND_MAX + 1.0f);
  }

  // 在缓冲区中构建B的八叉树结构
  octree.setInputCloud (cloudB);
  octree.addPointsFromInputCloud ();

  std::vector<int> newPointIdxVector;

  // B-A型点索引,即B相对A不同的点
  octree.getPointIndicesFromNewVoxels (newPointIdxVector);

  // Output points
  std::cout << "Output from getPointIndicesFromNewVoxels:" << std::endl;
  for (std::size_t i = 0; i < newPointIdxVector.size (); ++i)
    std::cout << i << "# Index:" << newPointIdxVector[i]
              << "  Point:" << (*cloudB)[newPointIdxVector[i]].x << " "
              << (*cloudB)[newPointIdxVector[i]].y << " "
              << (*cloudB)[newPointIdxVector[i]].z << std::endl;

}
  • pcl::octree::OctreePointCloudChangeDetector类继承自pcl::octree::OctreePointCloudpcl::octree::Octree2BufBase
  • 检测类本身没有其他重写或新的方法,只有一个变化检测新索引的功能(getPointIndicesFromNewVoxels),其他方法继承自父类。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用PCL1.8.1进行点变化检测的C++代码示例: ``` #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/filters/passthrough.h> #include <pcl/registration/icp.h> int main (int argc, char** argv) { // 加载点数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in (new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ> ("input_cloud.pcd", *cloud_in) == -1) //* load the file { PCL_ERROR ("Couldn't read file input_cloud.pcd \n"); return (-1); } // 过滤点数据 pcl::PassThrough<pcl::PointXYZ> pass; pass.setInputCloud (cloud_in); pass.setFilterFieldName ("z"); pass.setFilterLimits (0.0, 1.0); pass.filter (*cloud_out); // 点变换 pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp; icp.setInputSource (cloud_in); icp.setInputTarget (cloud_out); pcl::PointCloud<pcl::PointXYZ> Final; icp.align (Final); // 可视化 pcl::visualization::PCLVisualizer viewer ("ICP example"); viewer.addPointCloud (cloud_in, "cloud_in"); viewer.addPointCloud (cloud_out, "cloud_out"); viewer.addPointCloud (Final.makeShared(), "cloud_transformed"); viewer.spin (); return (0); } ``` 该示例中首先加载点数据,然后使用PassThrough滤波器进行过滤,将点数据限制在z方向上[0,1]的范围内。接着使用IterativeClosestPoint算法进行点变换,最后可视化显示原始点、过滤后的点和变换后的点

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值