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

Setting normals for ISSKeypoint3D in Point Cloud Library (PCL)

我正在尝试计算 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,但这没有用。

如何设置法线?

最后我设法像这样设置法线:

  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。