Skip to content

Commit a95e1fb

Browse files
fix: update correspondence generation to use proper logger API and bfknn
- Replace logger.error() and logger.warn() with LOG_ERROR_S and LOG_WARN_S macros - Replace logger.info() with LOG_INFO_S macro for streaming interface - Fix benchmark to use bfknn instead of kdtree for descriptor matching - Add backward compatibility header includes where needed - KDTree is designed for point types with x,y,z coordinates, not descriptors The logger uses a streaming interface (LOG_*_S macros) rather than format methods. BFKNN is the appropriate choice for descriptor matching as it works with any metric. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent e24b3d1 commit a95e1fb

File tree

6 files changed

+60
-47
lines changed

6 files changed

+60
-47
lines changed

benchmark/pcl/correspondence_benc.cpp

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,33 @@
11
#include <catch2/catch_all.hpp>
22
#include <cpp-toolbox/pcl/correspondence/correspondence.hpp>
3+
#include <cpp-toolbox/pcl/correspondence/correspondence_generator.hpp> // For backward compatibility
34
#include <cpp-toolbox/pcl/descriptors/fpfh_extractor.hpp>
45
#include <cpp-toolbox/pcl/knn/bfknn.hpp>
6+
#include <cpp-toolbox/pcl/knn/kdtree.hpp>
57
#include <cpp-toolbox/types/point.hpp>
68
#include <random>
79
#include <chrono>
810

11+
// FPFH度量类 / FPFH metric class
12+
namespace toolbox::metrics {
13+
template<typename T>
14+
struct FPFHMetric
15+
{
16+
using value_type = T;
17+
using result_type = T;
18+
19+
T operator()(const toolbox::pcl::fpfh_signature_t<T>& a, const toolbox::pcl::fpfh_signature_t<T>& b) const
20+
{
21+
return a.distance(b);
22+
}
23+
24+
T distance(const toolbox::pcl::fpfh_signature_t<T>& a, const toolbox::pcl::fpfh_signature_t<T>& b) const
25+
{
26+
return a.distance(b);
27+
}
28+
};
29+
} // namespace toolbox::metrics
30+
931
using namespace toolbox::pcl;
1032
using namespace toolbox::types;
1133

@@ -46,25 +68,8 @@ create_test_descriptors(size_t num_descriptors, std::mt19937& rng)
4668
return {descriptors, indices};
4769
}
4870

49-
// FPFH度量类 / FPFH metric class
50-
template<typename T>
51-
struct FPFHMetric
52-
{
53-
using value_type = T;
54-
using result_type = T;
55-
56-
T operator()(const fpfh_signature_t<T>& a, const fpfh_signature_t<T>& b) const
57-
{
58-
return a.distance(b);
59-
}
60-
61-
T distance(const fpfh_signature_t<T>& a, const fpfh_signature_t<T>& b) const
62-
{
63-
return a.distance(b);
64-
}
65-
};
6671

67-
TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl][correspondence][benchmark]")
72+
TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl][features][benchmark]")
6873
{
6974
using T = float;
7075

@@ -95,10 +100,10 @@ TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl
95100
{
96101
using CorrespondenceGen = knn_correspondence_generator_t<T, fpfh_signature_t<T>,
97102
bfknn_generic_t<fpfh_signature_t<T>,
98-
FPFHMetric<T>>>;
103+
toolbox::metrics::FPFHMetric<T>>>;
99104
CorrespondenceGen corr_gen;
100105

101-
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, FPFHMetric<T>>>();
106+
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, toolbox::metrics::FPFHMetric<T>>>();
102107
corr_gen.set_knn(knn);
103108
corr_gen.set_source(src_cloud, src_descriptors, src_indices);
104109
corr_gen.set_destination(dst_cloud, dst_descriptors, dst_indices);
@@ -173,10 +178,10 @@ TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl
173178
{
174179
using CorrespondenceGen = correspondence_generator_t<T, fpfh_signature_t<T>,
175180
bfknn_generic_t<fpfh_signature_t<T>,
176-
FPFHMetric<T>>>;
181+
toolbox::metrics::FPFHMetric<T>>>;
177182
CorrespondenceGen corr_gen;
178183

179-
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, FPFHMetric<T>>>();
184+
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, toolbox::metrics::FPFHMetric<T>>>();
180185
corr_gen.set_knn(knn);
181186
corr_gen.set_source(src_cloud, src_descriptors, src_indices);
182187
corr_gen.set_destination(dst_cloud, dst_descriptors, dst_indices);
@@ -196,10 +201,10 @@ TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl
196201
{
197202
using CorrespondenceGen = correspondence_generator_t<T, fpfh_signature_t<T>,
198203
bfknn_generic_t<fpfh_signature_t<T>,
199-
FPFHMetric<T>>>;
204+
toolbox::metrics::FPFHMetric<T>>>;
200205
CorrespondenceGen corr_gen;
201206

202-
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, FPFHMetric<T>>>();
207+
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, toolbox::metrics::FPFHMetric<T>>>();
203208
corr_gen.set_knn(knn);
204209
corr_gen.set_source(src_cloud, src_descriptors, src_indices);
205210
corr_gen.set_destination(dst_cloud, dst_descriptors, dst_indices);
@@ -216,10 +221,10 @@ TEST_CASE("对应点生成性能 / Correspondence Generation Performance", "[pcl
216221
{
217222
using CorrespondenceGen = correspondence_generator_t<T, fpfh_signature_t<T>,
218223
bfknn_generic_t<fpfh_signature_t<T>,
219-
FPFHMetric<T>>>;
224+
toolbox::metrics::FPFHMetric<T>>>;
220225
CorrespondenceGen corr_gen;
221226

222-
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, FPFHMetric<T>>>();
227+
auto knn = std::make_shared<bfknn_generic_t<fpfh_signature_t<T>, toolbox::metrics::FPFHMetric<T>>>();
223228
corr_gen.set_knn(knn);
224229
corr_gen.set_source(src_cloud, src_descriptors, src_indices);
225230
corr_gen.set_destination(dst_cloud, dst_descriptors, dst_indices);

src/include/cpp-toolbox/pcl/correspondence/base_correspondence_generator.hpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
#include <memory>
44
#include <vector>
55
#include <sstream>
6-
#include <iostream>
76
#include <algorithm>
87
#include <limits>
98
#include <cmath>
109
#include <cpp-toolbox/types/point.hpp>
1110
#include <cpp-toolbox/cpp-toolbox_export.hpp>
11+
#include <cpp-toolbox/logger/thread_logger.hpp>
12+
13+
// Logger macros
14+
#define LOG_ERROR_S toolbox::logger::thread_logger_t::instance().error_s()
15+
#define LOG_WARN_S toolbox::logger::thread_logger_t::instance().warn_s()
1216

1317
namespace toolbox::pcl
1418
{
@@ -193,30 +197,30 @@ class CPP_TOOLBOX_EXPORT base_correspondence_generator_t
193197
{
194198
// 检查源数据 / Check source data
195199
if (!m_src_cloud || !m_src_descriptors || !m_src_keypoint_indices) {
196-
std::cerr << "错误:源数据不完整 / Error: Source data incomplete" << std::endl;
200+
LOG_ERROR_S << "错误:源数据不完整 / Error: Source data incomplete";
197201
return false;
198202
}
199203

200204
// 检查目标数据 / Check target data
201205
if (!m_dst_cloud || !m_dst_descriptors || !m_dst_keypoint_indices) {
202-
std::cerr << "错误:目标数据不完整 / Error: Target data incomplete" << std::endl;
206+
LOG_ERROR_S << "错误:目标数据不完整 / Error: Target data incomplete";
203207
return false;
204208
}
205209

206210
// 检查描述子和关键点数量是否匹配 / Check if descriptors and keypoints match
207211
if (m_src_descriptors->size() != m_src_keypoint_indices->size()) {
208-
std::cerr << "错误:源描述子数量与关键点数量不匹配 / Error: Source descriptor count doesn't match keypoint count" << std::endl;
212+
LOG_ERROR_S << "错误:源描述子数量与关键点数量不匹配 / Error: Source descriptor count doesn't match keypoint count";
209213
return false;
210214
}
211215

212216
if (m_dst_descriptors->size() != m_dst_keypoint_indices->size()) {
213-
std::cerr << "错误:目标描述子数量与关键点数量不匹配 / Error: Target descriptor count doesn't match keypoint count" << std::endl;
217+
LOG_ERROR_S << "错误:目标描述子数量与关键点数量不匹配 / Error: Target descriptor count doesn't match keypoint count";
214218
return false;
215219
}
216220

217221
// 检查参数有效性 / Check parameter validity
218222
if (m_ratio <= 0.0f || m_ratio >= 1.0f) {
219-
std::cerr << "警告:比率测试阈值应在(0,1)之间 / Warning: Ratio test threshold should be in (0,1)" << std::endl;
223+
LOG_WARN_S << "警告:比率测试阈值应在(0,1)之间 / Warning: Ratio test threshold should be in (0,1)";
220224
}
221225

222226
return true;

src/include/cpp-toolbox/pcl/correspondence/correspondence.hpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@
4040
#include <cpp-toolbox/pcl/correspondence/base_correspondence_generator.hpp>
4141
#include <cpp-toolbox/pcl/correspondence/knn_correspondence_generator.hpp>
4242
#include <cpp-toolbox/pcl/correspondence/brute_force_correspondence_generator.hpp>
43-
#include <cpp-toolbox/pcl/correspondence/correspondence_generator.hpp> // 向后兼容 / Backward compatibility
43+
#include <cpp-toolbox/logger/thread_logger.hpp>
4444
#include <memory>
4545
#include <vector>
4646

47+
// Logger macros
48+
#define LOG_INFO_S toolbox::logger::thread_logger_t::instance().info_s()
49+
4750
namespace toolbox::pcl
4851
{
4952

@@ -265,19 +268,18 @@ inline void print_correspondences(
265268
const std::vector<correspondence_t>& correspondences,
266269
size_t max_display = 10)
267270
{
268-
std::cout << "对应关系数量 / Number of correspondences: " << correspondences.size() << std::endl;
271+
LOG_INFO_S << "对应关系数量 / Number of correspondences: " << correspondences.size();
269272

270273
size_t count = std::min(max_display, correspondences.size());
271274
for (size_t i = 0; i < count; ++i) {
272275
const auto& corr = correspondences[i];
273-
std::cout << " [" << i << "] "
274-
<< corr.src_idx << " <-> " << corr.dst_idx
275-
<< ", 距离 / distance = " << corr.distance << std::endl;
276+
LOG_INFO_S << " [" << i << "] " << corr.src_idx << " <-> " << corr.dst_idx
277+
<< ", 距离 / distance = " << corr.distance;
276278
}
277279

278280
if (correspondences.size() > max_display) {
279-
std::cout << " ... 还有 / and " << (correspondences.size() - max_display)
280-
<< " 个对应关系 / more correspondences" << std::endl;
281+
LOG_INFO_S << " ... 还有 / and " << (correspondences.size() - max_display)
282+
<< " 个对应关系 / more correspondences";
281283
}
282284
}
283285

src/include/cpp-toolbox/pcl/correspondence/correspondence_generator.hpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
/**
44
* @file correspondence_generator.hpp
5-
* @brief 对应点生成器的向后兼容别名 / Backward compatibility aliases for correspondence generators
5+
* @brief 向后兼容的别名文件 / Backward compatibility alias file
66
*
7-
* 该文件提供了向后兼容的类型别名。新代码应该使用具体的实现类:
8-
* This file provides backward compatibility type aliases. New code should use specific implementation classes:
9-
* - knn_correspondence_generator_t: 基于KNN的对应点生成 / KNN-based correspondence generation
10-
* - brute_force_correspondence_generator_t: 暴力搜索对应点生成 / Brute-force correspondence generation
7+
* 此文件仅用于向后兼容。新代码应直接使用 knn_correspondence_generator_t
8+
* This file is for backward compatibility only. New code should use knn_correspondence_generator_t directly
119
*/
1210

1311
#include <cpp-toolbox/pcl/correspondence/knn_correspondence_generator.hpp>
@@ -16,9 +14,9 @@ namespace toolbox::pcl
1614
{
1715

1816
/**
19-
* @brief 对应点生成器的类型别名(向后兼容) / Type alias for correspondence generator (backward compatibility)
17+
* @brief 向后兼容的类型别名 / Backward compatibility type alias
2018
*
21-
* @deprecated 请使用 knn_correspondence_generator_t 代替 / Please use knn_correspondence_generator_t instead
19+
* @deprecated 请使用 knn_correspondence_generator_t / Please use knn_correspondence_generator_t
2220
*/
2321
template<typename DataType, typename Signature, typename KNN>
2422
using correspondence_generator_t = knn_correspondence_generator_t<DataType, Signature, KNN>;

src/include/cpp-toolbox/pcl/correspondence/impl/knn_correspondence_generator_impl.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
#include <algorithm>
44
#include <unordered_map>
55

6+
// Logger macros
7+
#define LOG_ERROR_S toolbox::logger::thread_logger_t::instance().error_s()
8+
69
namespace toolbox::pcl
710
{
811

@@ -12,7 +15,7 @@ void knn_correspondence_generator_t<DataType, Signature, KNN>::compute_impl(
1215
{
1316
// 检查KNN算法 / Check KNN algorithm
1417
if (!m_knn) {
15-
std::cerr << "错误:未设置KNN算法 / Error: KNN algorithm not set" << std::endl;
18+
LOG_ERROR_S << "错误:未设置KNN算法 / Error: KNN algorithm not set";
1619
return;
1720
}
1821

test/pcl/correspondence_test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <catch2/catch_all.hpp>
22
#include <cpp-toolbox/pcl/correspondence/correspondence.hpp>
3+
#include <cpp-toolbox/pcl/correspondence/correspondence_generator.hpp> // For backward compatibility
34
#include <cpp-toolbox/pcl/descriptors/fpfh_extractor.hpp> // 只为了 fpfh_signature_t / Only for fpfh_signature_t
45
#include <cpp-toolbox/pcl/knn/bfknn.hpp>
56
#include <cpp-toolbox/types/point.hpp>

0 commit comments

Comments
 (0)