185 correspondences.resize(indices_->size());
188 std::vector<float> distance(1);
189 std::vector<pcl::Correspondences> per_thread_correspondences(num_threads_);
190 for (
auto& corrs : per_thread_correspondences) {
191 corrs.reserve(2 * indices_->size() / num_threads_);
193 const double max_dist_sqr = max_distance * max_distance;
195#pragma omp parallel for default(none) \
196 shared(max_dist_sqr, per_thread_correspondences) firstprivate(index, distance) \
197 num_threads(num_threads_)
199 for (
int i = 0; i < static_cast<int>(indices_->size()); i++) {
200 const auto& idx = (*indices_)[i];
204 const auto& pt = detail::pointCopyOrRef<PointTarget, PointSource>(input_, idx);
207 tree_->nearestKSearch(pt, 1, index, distance);
208 if (distance[0] > max_dist_sqr)
217 const int thread_num = omp_get_thread_num();
219 const int thread_num = 0;
222 per_thread_correspondences[thread_num].emplace_back(corr);
225 if (num_threads_ == 1) {
226 correspondences = std::move(per_thread_correspondences.front());
229 const unsigned int nr_correspondences = std::accumulate(
230 per_thread_correspondences.begin(),
231 per_thread_correspondences.end(),
232 static_cast<unsigned int>(0),
233 [](
const auto sum,
const auto& corr) { return sum + corr.size(); });
234 correspondences.resize(nr_correspondences);
237 auto insert_loc = correspondences.begin();
238 for (
const auto& corrs : per_thread_correspondences) {
239 const auto new_insert_loc = std::move(corrs.begin(), corrs.end(), insert_loc);
240 std::inplace_merge(correspondences.begin(),
242 insert_loc + corrs.size(),
243 [](
const auto& lhs,
const auto& rhs) {
244 return lhs.index_query < rhs.index_query;
246 insert_loc = new_insert_loc;
256 const double max_distance)
263 if (!initComputeReciprocal())
266 correspondences.resize(indices_->size());
268 std::vector<float> distance(1);
270 std::vector<float> distance_reciprocal(1);
271 std::vector<pcl::Correspondences> per_thread_correspondences(num_threads_);
272 for (
auto& corrs : per_thread_correspondences) {
273 corrs.reserve(2 * indices_->size() / num_threads_);
275 const double max_dist_sqr = max_distance * max_distance;
277#pragma omp parallel for default(none) \
278 shared(max_dist_sqr, per_thread_correspondences) \
279 firstprivate(index, distance, index_reciprocal, distance_reciprocal) \
280 num_threads(num_threads_)
282 for (
int i = 0; i < static_cast<int>(indices_->size()); i++) {
283 const auto& idx = (*indices_)[i];
288 const auto& pt_src = detail::pointCopyOrRef<PointTarget, PointSource>(input_, idx);
291 tree_->nearestKSearch(pt_src, 1, index, distance);
292 if (distance[0] > max_dist_sqr)
295 const auto target_idx = index[0];
297 detail::pointCopyOrRef<PointSource, PointTarget>(target_, target_idx);
299 tree_reciprocal_->nearestKSearch(pt_tgt, 1, index_reciprocal, distance_reciprocal);
300 if (distance_reciprocal[0] > max_dist_sqr || idx != index_reciprocal[0])
309 const int thread_num = omp_get_thread_num();
311 const int thread_num = 0;
314 per_thread_correspondences[thread_num].emplace_back(corr);
317 if (num_threads_ == 1) {
318 correspondences = std::move(per_thread_correspondences.front());
321 const unsigned int nr_correspondences = std::accumulate(
322 per_thread_correspondences.begin(),
323 per_thread_correspondences.end(),
324 static_cast<unsigned int>(0),
325 [](
const auto sum,
const auto& corr) { return sum + corr.size(); });
326 correspondences.resize(nr_correspondences);
329 auto insert_loc = correspondences.begin();
330 for (
const auto& corrs : per_thread_correspondences) {
331 const auto new_insert_loc = std::move(corrs.begin(), corrs.end(), insert_loc);
332 std::inplace_merge(correspondences.begin(),
334 insert_loc + corrs.size(),
335 [](
const auto& lhs,
const auto& rhs) {
336 return lhs.index_query < rhs.index_query;
338 insert_loc = new_insert_loc;