40#ifndef PCL_RECOGNITION_GEOMETRIC_CONSISTENCY_IMPL_H_
41#define PCL_RECOGNITION_GEOMETRIC_CONSISTENCY_IMPL_H_
43#include <pcl/recognition/cg/geometric_consistency.h>
44#include <pcl/registration/correspondence_types.h>
45#include <pcl/registration/correspondence_rejection_sample_consensus.h>
46#include <pcl/common/io.h>
56template<
typename Po
intModelT,
typename Po
intSceneT>
void
59 model_instances.clear ();
65 "[pcl::GeometricConsistencyGrouping::clusterCorrespondences()] Error! Correspondences not set, please set them before calling again this function.\n");
71 std::sort (sorted_corrs->begin (), sorted_corrs->end (), gcCorrespSorter);
74 PCL_DEBUG_STREAM(
"[pcl::GeometricConsistencyGrouping::clusterCorrespondences] Five best correspondences: ");
77 PCL_DEBUG_STREAM(std::endl);
79 std::vector<int> consensus_set;
82 Eigen::Vector3f dist_ref, dist_trg;
96 if (taken_corresps[i])
99 consensus_set.clear ();
100 consensus_set.push_back (
static_cast<int> (i));
104 if ( j != i && !taken_corresps[j])
107 bool is_a_good_candidate =
true;
108 for (
const int &k : consensus_set)
115 const Eigen::Vector3f& scene_point_k =
scene_->at (scene_index_k).getVector3fMap ();
116 const Eigen::Vector3f& model_point_k =
input_->at (model_index_k).getVector3fMap ();
117 const Eigen::Vector3f& scene_point_j =
scene_->at (scene_index_j).getVector3fMap ();
118 const Eigen::Vector3f& model_point_j =
input_->at (model_index_j).getVector3fMap ();
120 dist_ref = scene_point_k - scene_point_j;
121 dist_trg = model_point_k - model_point_j;
123 double distance = std::abs (dist_ref.norm () - dist_trg.norm ());
127 is_a_good_candidate =
false;
132 if (is_a_good_candidate)
133 consensus_set.push_back (
static_cast<int> (j));
137 if (
static_cast<int> (consensus_set.size ()) >
gc_threshold_)
140 for (
const int &j : consensus_set)
143 taken_corresps[ j ] =
true;
150 model_instances.push_back (filtered_corrs);
156template<
typename Po
intModelT,
typename Po
intSceneT>
bool
158 std::vector<Eigen::Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f> > &transformations)
160 std::vector<pcl::Correspondences> model_instances;
161 return (this->
recognize (transformations, model_instances));
165template<
typename Po
intModelT,
typename Po
intSceneT>
bool
167 std::vector<Eigen::Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f> > &transformations, std::vector<pcl::Correspondences> &clustered_corrs)
169 transformations.clear ();
173 "[pcl::GeometricConsistencyGrouping::recognize()] Error! Model cloud or Scene cloud not set, please set them before calling again this function.\n");
185#define PCL_INSTANTIATE_GeometricConsistencyGrouping(T,ST) template class PCL_EXPORTS pcl::GeometricConsistencyGrouping<T,ST>;
CorrespondencesConstPtr model_scene_corrs_
The correspondences between points in the input and the scene datasets.
bool initCompute()
This method should get called before starting the actual computation.
bool deinitCompute()
This method should get called after finishing the actual computation.
SceneCloudConstPtr scene_
The scene cloud.
int gc_threshold_
Minimum cluster size.
double gc_size_
Resolution of the consensus set used to cluster correspondences together.
void clusterCorrespondences(std::vector< Correspondences > &model_instances) override
Cluster the input correspondences in order to distinguish between different instances of the model in...
typename PointCloud::Ptr PointCloudPtr
pcl::PointCloud< PointModelT > PointCloud
bool recognize(std::vector< Eigen::Matrix4f, Eigen::aligned_allocator< Eigen::Matrix4f > > &transformations)
The main function, recognizes instances of the model into the scene set by the user.
std::vector< Eigen::Matrix4f, Eigen::aligned_allocator< Eigen::Matrix4f > > found_transformations_
Transformations found by clusterCorrespondences method.
PointCloudConstPtr input_
CorrespondenceRejectorSampleConsensus implements a correspondence rejection using Random Sample Conse...
virtual void setInputSource(const PointCloudConstPtr &cloud)
Provide a source point cloud dataset (must contain XYZ data!)
Eigen::Matrix4f getBestTransformation()
Get the best transformation after RANSAC rejection.
virtual void setInputTarget(const PointCloudConstPtr &cloud)
Provide a target point cloud dataset (must contain XYZ data!)
void setInlierThreshold(double threshold)
Set the maximum distance between corresponding points.
void setMaximumIterations(int max_iterations)
Set the maximum number of iterations.
void getRemainingCorrespondences(const pcl::Correspondences &original_correspondences, pcl::Correspondences &remaining_correspondences) override
Get a list of valid correspondences after rejection from the original set of correspondences.
void copyPointCloud(const pcl::PointCloud< PointInT > &cloud_in, pcl::PointCloud< PointOutT > &cloud_out)
Copy all the fields from a given point cloud into a new point cloud.
std::vector< pcl::Correspondence, Eigen::aligned_allocator< pcl::Correspondence > > Correspondences
shared_ptr< Correspondences > CorrespondencesPtr
Correspondence represents a match between two entities (e.g., points, descriptors,...