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);
75 std::vector<int> consensus_set;
78 Eigen::Vector3f dist_ref, dist_trg;
92 if (taken_corresps[i])
95 consensus_set.clear ();
96 consensus_set.push_back (
static_cast<int> (i));
100 if ( j != i && !taken_corresps[j])
103 bool is_a_good_candidate =
true;
104 for (
const int &k : consensus_set)
111 const Eigen::Vector3f& scene_point_k =
scene_->at (scene_index_k).getVector3fMap ();
112 const Eigen::Vector3f& model_point_k =
input_->at (model_index_k).getVector3fMap ();
113 const Eigen::Vector3f& scene_point_j =
scene_->at (scene_index_j).getVector3fMap ();
114 const Eigen::Vector3f& model_point_j =
input_->at (model_index_j).getVector3fMap ();
116 dist_ref = scene_point_k - scene_point_j;
117 dist_trg = model_point_k - model_point_j;
119 double distance = std::abs (dist_ref.norm () - dist_trg.norm ());
123 is_a_good_candidate =
false;
128 if (is_a_good_candidate)
129 consensus_set.push_back (
static_cast<int> (j));
133 if (
static_cast<int> (consensus_set.size ()) >
gc_threshold_)
136 for (
const int &j : consensus_set)
139 taken_corresps[ j ] =
true;
146 model_instances.push_back (filtered_corrs);
152template<
typename Po
intModelT,
typename Po
intSceneT>
bool
154 std::vector<Eigen::Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f> > &transformations)
156 std::vector<pcl::Correspondences> model_instances;
157 return (this->
recognize (transformations, model_instances));
161template<
typename Po
intModelT,
typename Po
intSceneT>
bool
163 std::vector<Eigen::Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f> > &transformations, std::vector<pcl::Correspondences> &clustered_corrs)
165 transformations.clear ();
169 "[pcl::GeometricConsistencyGrouping::recognize()] Error! Model cloud or Scene cloud not set, please set them before calling again this function.\n");
181#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,...