我正在使用pcl
的{{1}}实施。我希望能够使用我使用的任何注册方法中的inlier点。
iterative closest point
类能够在调用对齐函数时输出对齐的云:
registration
icp_.align(outcloud, guess);
类具有以下功能:
PCLBase
不幸的是indices = icp_.getIndices();
只返回整个云的索引。我已经在云上进行了测试,并且距离通信拒绝的异常值(或内部函数)似乎无法检索?
我已经检查过云中应该被拒绝的点,见下文:
答案 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
的值,因此您可能需要检查距离以确保仅获得你想要的通信。
答案 1 :(得分:1)
我认为您可能会使用受保护的correspondences_
成员:
http://docs.pointclouds.org/1.7.0/classpcl_1_1_registration.html#a98f1c160391fff07f34339b63286e228
由于它受到保护,您可能应该继承ICP并添加一个存取方法。
有关如何使用此成员的详细信息,请参阅: