在点云库(PCL)中设置ISSKeypoint3D的法线

时间:2016-03-09 13:39:00

标签: pointers type-conversion point-cloud-library normals

我正在尝试在PCL中的点云上计算ISS3D关键点。我想设置 法线因为我不确定ISS关键点估计是否会翻转它们 在正确的方向。但是,当我尝试设置这样的法线时

typedef pcl::PointCloud<pcl::PointXYZRGB> > PointCloud;

PointCloud::Ptr detecISSKeypoints(PointCloud::Ptr cloud, pcl::PointCloud<pcl::PointNormal>::Ptr normals, float resolution) {
  pcl::PointCloud<pcl::PointXYZRGB>::Ptr keypoints(new pcl::PointCloud<pcl::PointXYZRGB>);
  pcl::ISSKeypoint3D<pcl::PointXYZRGB, pcl::PointXYZRGB> detector;
  detector.setInputCloud(cloud);
  detector.setNormals(normals);
  pcl::search::KdTree<pcl::PointXYZRGB>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZRGB>);
  detector.setSearchMethod(kdtree);
  detector.setSalientRadius(6 * resolution);
  detector.setNonMaxRadius(6 * resolution);
  detector.setMinNeighbors(6);
  detector.setThreshold21(0.975);
  detector.setThreshold32(0.975);
  detector.setNumberOfThreads(4);
  detector.compute(*keypoints);
  return keypoints;
}

我收到setNormals期待const PointCloudNConstPtr&的错误。我试图将法线的指针转换为const pcl::PointCloud<pcl::PointNormal>::ConstPtr,但这不起作用。

如何设置法线?

1 个答案:

答案 0 :(得分:0)

最后我设法设置了这样的法线:

  pcl::PointCloud<pcl::Normal>::Ptr normalsCopy (new pcl::PointCloud<pcl::Normal>);
  copyPointCloud(*normals, *normalsCopy);
  boost::shared_ptr<const pcl::PointCloud<pcl::Normal> > constNormals (normalsCopy);
  detector.setNormals(constNormals);

问题是ISSKeypoint3D只接受pcl::Normal,而不接受pcl::PointNormal,并且指针必须是一个恒定的pointlcoud。