38 : min_cluster_size_(1),
39 max_cluster_size_(
std::numeric_limits<int>::max()),
40 extract_removed_clusters_(extract_removed_clusters),
54 int (*candidate_function)(
const PointT&,
void*, std::vector<int>*)) {
55 candidate_function_ = candidate_function;
63 condition_function_ = condition_function;
74 typename std::shared_ptr<base::PointCloud<PointT>> cloud_;
75 size_t min_cluster_size_ = 0;
76 size_t max_cluster_size_ = 0;
77 bool extract_removed_clusters_ =
true;
78 std::shared_ptr<IndicesClusters> small_clusters_;
79 std::shared_ptr<IndicesClusters> large_clusters_;
80 bool (*condition_function_)(
const PointT&,
const PointT&,
81 void* param) =
nullptr;
82 int (*candidate_function_)(
const PointT&,
void*,
83 std::vector<int>* nn_indices_ptr) =
nullptr;
84 void* candidate_param_ =
nullptr;
85 void* condition_param_ =
nullptr;
90 std::vector<int> nn_indices;
91 nn_indices.reserve(200);
92 std::vector<bool> processed(cloud_->size(),
false);
94 for (std::size_t iii = 0; iii < cloud_->size(); ++iii) {
99 std::vector<int> current_cluster;
100 current_cluster.reserve(200);
102 current_cluster.push_back(
static_cast<int>(iii));
103 processed[iii] =
true;
106 while (cii < current_cluster.size()) {
108 if (candidate_function_(cloud_->at(current_cluster[cii]),
109 candidate_param_, &nn_indices) < 1) {
113 for (std::size_t nii = 1; nii < nn_indices.size(); ++nii) {
114 if (nn_indices[nii] < 0 ||
115 nn_indices[nii] >=
static_cast<int>(processed.size()) ||
116 processed[nn_indices[nii]]) {
119 if (condition_function_(cloud_->at(current_cluster[cii]),
120 cloud_->at(nn_indices[nii]),
122 current_cluster.push_back(nn_indices[nii]);
123 processed[nn_indices[nii]] =
true;
129 if (extract_removed_clusters_ ||
130 (current_cluster.size() >= min_cluster_size_ &&
131 current_cluster.size() <= max_cluster_size_)) {
133 pi.
indices.resize(current_cluster.size());
134 for (
int ii = 0; ii < static_cast<int>(current_cluster.size()); ++ii) {
135 pi.
indices[ii] = current_cluster[ii];
138 if (extract_removed_clusters_ &&
139 current_cluster.size() < min_cluster_size_) {
140 small_clusters_->push_back(pi);
141 }
else if (extract_removed_clusters_ &&
142 current_cluster.size() > max_cluster_size_) {
143 large_clusters_->push_back(pi);
145 xy_clusters->push_back(pi);