Skip to content

Commit e24b3d1

Browse files
refactor: implement CRTP-based correspondence generation with KNN and brute-force methods
- Create base_correspondence_generator_t using CRTP pattern for static polymorphism - Implement knn_correspondence_generator_t for fast KNN-based matching - Implement brute_force_correspondence_generator_t with parallel computation support - Maintain backward compatibility by aliasing correspondence_generator_t to KNN version - Add convenience functions for both KNN and brute-force correspondence generation - Include comprehensive validation, ratio test, mutual verification, and distance threshold filtering - Update tests and benchmarks to compare both methods - Benchmark results show brute-force parallel is significantly faster for larger datasets: - 100 descriptors: All methods ~150μs - 500 descriptors: Brute-force parallel 4x faster (~1.3ms vs ~5.5ms) - 1000 descriptors: Brute-force parallel 9x faster (~2.3ms vs ~20-22ms) This refactoring provides flexibility to choose between accuracy-focused KNN methods and performance-focused brute-force methods based on application requirements. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent ec79732 commit e24b3d1

10 files changed

+1066
-571
lines changed

benchmark/pcl/correspondence_benc.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
#include <catch2/catch_all.hpp>
2-
#include <cpp-toolbox/pcl/correspondence/correspondence_generator.hpp>
2+
#include <cpp-toolbox/pcl/correspondence/correspondence.hpp>
33
#include <cpp-toolbox/pcl/descriptors/fpfh_extractor.hpp>
44
#include <cpp-toolbox/pcl/knn/bfknn.hpp>
5-
#include <cpp-toolbox/pcl/knn/bfknn_parallel.hpp>
65
#include <cpp-toolbox/types/point.hpp>
76
#include <random>
87
#include <chrono>
@@ -91,12 +90,12 @@ TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl
9190
src_cloud->points.resize(num_desc * 10);
9291
dst_cloud->points.resize(num_desc * 10);
9392

94-
// 暴力搜索 / Brute-force search
95-
BENCHMARK("暴力KNN / Brute-force KNN")
93+
// KNN方法 / KNN method
94+
BENCHMARK("KNN方法 / KNN method")
9695
{
97-
using CorrespondenceGen = correspondence_generator_t<T, fpfh_signature_t<T>,
98-
bfknn_generic_t<fpfh_signature_t<T>,
99-
FPFHMetric<T>>>;
96+
using CorrespondenceGen = knn_correspondence_generator_t<T, fpfh_signature_t<T>,
97+
bfknn_generic_t<fpfh_signature_t<T>,
98+
FPFHMetric<T>>>;
10099
CorrespondenceGen corr_gen;
101100

102101
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, FPFHMetric<T>>>();
@@ -112,8 +111,39 @@ TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl
112111
return correspondences.size();
113112
};
114113

115-
// 注释掉并行版本,因为它目前只支持点类型 / Comment out parallel version as it only supports point types
116-
// TODO: 修复 bfknn_parallel 以支持通用元素类型 / Fix bfknn_parallel to support generic element types
114+
// 暴力搜索方法(串行) / Brute-force method (serial)
115+
BENCHMARK("暴力搜索(串行) / Brute-force (serial)")
116+
{
117+
brute_force_correspondence_generator_t<T, fpfh_signature_t<T>> corr_gen;
118+
119+
corr_gen.enable_parallel(false);
120+
corr_gen.set_source(src_cloud, src_descriptors, src_indices);
121+
corr_gen.set_destination(dst_cloud, dst_descriptors, dst_indices);
122+
corr_gen.set_ratio(0.8f);
123+
corr_gen.set_mutual_verification(true);
124+
125+
std::vector<correspondence_t> correspondences;
126+
corr_gen.compute(correspondences);
127+
128+
return correspondences.size();
129+
};
130+
131+
// 暴力搜索方法(并行) / Brute-force method (parallel)
132+
BENCHMARK("暴力搜索(并行) / Brute-force (parallel)")
133+
{
134+
brute_force_correspondence_generator_t<T, fpfh_signature_t<T>> corr_gen;
135+
136+
corr_gen.enable_parallel(true);
137+
corr_gen.set_source(src_cloud, src_descriptors, src_indices);
138+
corr_gen.set_destination(dst_cloud, dst_descriptors, dst_indices);
139+
corr_gen.set_ratio(0.8f);
140+
corr_gen.set_mutual_verification(true);
141+
142+
std::vector<correspondence_t> correspondences;
143+
corr_gen.compute(correspondences);
144+
145+
return correspondences.size();
146+
};
117147
}
118148
}
119149
}

0 commit comments

Comments
 (0)