Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get inlier points not rejected by correspondence distance in pcl registration methods.

I am using the pcl implementation of iterative closest point. I would like to be able to play with the inlier points from any registration method that I use.

The registration class has the ability to output an aligned cloud when the align function is called:

icp_.align(outcloud, guess);

And the PCLBase class has the following function:

indices = icp_.getIndices();

Unfortunately getIndices just returns the indices for the entire cloud. I have tested on a cloud and the outliers (or inliers) rejected by distance correspondence don't seem to be retrievable?

I have checked and there are points in the cloud that should have been rejected, see below:

enter image description here

like image 760
Fantastic Mr Fox Avatar asked Oct 19 '25 07:10

Fantastic Mr Fox


2 Answers

Building off of D.J.Duff's answer, here's one way to get at corresponding points, though it involves violating the class. This one inherits from the IterativeClosestPointNonLinear class and can act as a substitute. For my use case, I just dropped it in wherever I wanted to use IterativeClosestPointNonLinear and be able to access the correspondences_ member. A similar approach could be used for any of the other registration interfaces.

/** \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_;
    }
};

Here are some lines drawn between corresponding points between two point clouds obtained in this manner. Notably, the pcl::Correspondence.distance value between two points doesn't always seem to be strictly less than the value of the registration method's maxCorrespondenceDistance, so you may have to check the distances to make sure you're getting only the correspondences you want.

                               Point correspondences between two clouds.

like image 116
Frogee Avatar answered Oct 21 '25 20:10

Frogee


I think you may get you want with the protected correspondences_ member:

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

As it is protected you probably should subclass ICP and add an accessor method.

For more information about how this member is used, see:

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

like image 23
D.J.Duff Avatar answered Oct 21 '25 19:10

D.J.Duff