在pcl注册方法中获取不被通信距离拒绝的内部点。

时间:2014-06-16 06:31:15

标签: c++ point-cloud-library

我正在使用pcl的{​​{1}}实施。我希望能够使用我使用的任何注册方法中的inlier点。

iterative closest point类能够在调用对齐函数时输出对齐的云:

registration

icp_.align(outcloud, guess); 类具有以下功能:

PCLBase

不幸的是indices = icp_.getIndices(); 只返回整个云的索引。我已经在云上进行了测试,并且距离通信拒绝的异常值(或内部函数)似乎无法检索?

我已经检查过云中应该被拒绝的点,见下文:

enter image description here

2 个答案:

答案 0 :(得分:3)

建立D.J.Duff的答案,这是获得相应点的一种方法,尽管它涉及违反课程。这个继承自IterativeClosestPointNonLinear类,可以作为替代。对于我的用例,我只是将它放在我想要使用IterativeClosestPointNonLinear的任何地方,并且能够访问correspondences_成员。类似的方法可以用于任何其他注册接口。

/** \brief This is a mock class with the sole purpose of accessing a protected member of a class it inherits from.
*
* Some of the relevant documentation for correspondences: http://docs.pointclouds.org/trunk/correspondence_8h_source.html#l00092
*/
template <typename PointSource, typename PointTarget, typename Scalar = float>
class IterativeClosestPointNonLinear_Exposed : public pcl::IterativeClosestPointNonLinear<PointSource, PointTarget, Scalar> {
  public:
    pcl::CorrespondencesPtr getCorrespondencesPtr() {
      for (uint32_t i = 0; i < this->correspondences_->size(); i++) {
        pcl::Correspondence currentCorrespondence = (*this->correspondences_)[i];
        std::cout << "Index of the source point: " << currentCorrespondence.index_query << std::endl;
        std::cout << "Index of the matching target point: " << currentCorrespondence.index_match << std::endl;
        std::cout << "Distance between the corresponding points: " << currentCorrespondence.distance << std::endl;
        std::cout << "Weight of the confidence in the correspondence: " << currentCorrespondence.weight << std::endl;
      }
      return this->correspondences_;
    }
};

以下是以这种方式获得的两个点云之间的对应点之间绘制的一些线。值得注意的是,两点之间的pcl::Correspondence.distance值似乎并不总是严格小于注册方法maxCorrespondenceDistance的值,因此您可能需要检查距离以确保仅获得你想要的通信。

Point correspondences between two clouds.

答案 1 :(得分:1)

我认为您可能会使用受保护的correspondences_成员:

http://docs.pointclouds.org/1.7.0/classpcl_1_1_registration.html#a98f1c160391fff07f34339b63286e228

由于它受到保护,您可能应该继承ICP并添加一个存取方法。

有关如何使用此成员的详细信息,请参阅:

http://docs.pointclouds.org/1.7.0/icp_8hpp_source.html