cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
base_correspondence_sorter.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <functional>
5#include <memory>
6#include <numeric>
7#include <vector>
8
9#include <cpp-toolbox/cpp-toolbox_export.hpp>
13
14// Logger macros
15#define LOG_ERROR_S toolbox::logger::thread_logger_t::instance().error_s()
16#define LOG_WARN_S toolbox::logger::thread_logger_t::instance().warn_s()
17#define LOG_INFO_S toolbox::logger::thread_logger_t::instance().info_s()
18
19namespace toolbox::pcl
20{
21
49template<typename Derived, typename DataType>
50class CPP_TOOLBOX_EXPORT base_correspondence_sorter_t
51{
52public:
54 using point_cloud_ptr = std::shared_ptr<point_cloud>;
55 using correspondences_ptr = std::shared_ptr<std::vector<correspondence_t>>;
56 using quality_scores_t = std::vector<DataType>;
57 using sorted_indices_t = std::vector<std::size_t>;
58
60 virtual ~base_correspondence_sorter_t() = default;
61
62 // 删除拷贝,允许移动 / Delete copy, allow move
65 delete;
68 default;
69
76 const point_cloud_ptr& target)
77 {
78 m_source_cloud = source;
79 m_target_cloud = target;
80 m_cached = false;
81 }
82
87 void set_correspondences(const correspondences_ptr& correspondences)
88 {
89 m_correspondences = correspondences;
90 m_cached = false;
91 }
92
102 {
103 if (!validate_input()) {
104 return sorted_indices_t{};
105 }
106
107 // 如果已缓存且输入未改变,直接返回 / If cached and input unchanged, return
108 // directly
109 if (m_cached) {
110 scores = m_cached_scores;
111 return m_cached_indices;
112 }
113
114 // 调用派生类实现计算质量分数 / Call derived class implementation to
115 // compute quality scores
116 scores.resize(m_correspondences->size());
117 static_cast<Derived*>(this)->compute_quality_scores_impl(scores);
118
119 // 创建索引数组并按质量分数排序 / Create index array and sort by quality
120 // scores
121 sorted_indices_t indices(scores.size());
122 std::iota(indices.begin(), indices.end(), 0);
123
124 // 降序排序(质量高的在前) / Sort in descending order (higher quality
125 // first)
126 std::sort(indices.begin(), indices.end(),
127 [&scores](std::size_t i, std::size_t j) {
128 return scores[i] > scores[j];
129 });
130
131 // 缓存结果 / Cache results
132 m_cached_scores = scores;
133 m_cached_indices = indices;
134 m_cached = true;
135
136 return indices;
137 }
138
145 {
146 quality_scores_t scores;
147 compute_sorted_indices(scores);
148 return scores;
149 }
150
155 [[nodiscard]] std::string get_sorter_name() const
156 {
157 return static_cast<const Derived*>(this)->get_sorter_name_impl();
158 }
159
164 {
165 m_cached = false;
166 m_cached_scores.clear();
167 m_cached_indices.clear();
168 }
169
175 void enable_parallel(bool enable = true) { m_parallel_enabled = enable; }
176
181 [[nodiscard]] bool is_parallel_enabled() const { return m_parallel_enabled; }
182
183protected:
188 [[nodiscard]] bool validate_input() const
189 {
190 if (!m_correspondences || m_correspondences->empty()) {
191 LOG_ERROR_S << "错误:对应关系为空 / Error: Correspondences are empty";
192 return false;
193 }
194
195 if (!m_source_cloud || !m_target_cloud) {
197 << "警告:点云未设置,某些排序器可能需要点云数据 / Warning: Point "
198 "clouds not set, some sorters may need point cloud data";
199 }
200
201 return static_cast<const Derived*>(this)->validate_input_impl();
202 }
203
209 [[nodiscard]] bool validate_input_impl() const { return true; }
210
216 [[nodiscard]] std::string get_sorter_name_impl() const
217 {
218 return "BaseCorrespondenceSorter";
219 }
220
224 [[nodiscard]] const point_cloud_ptr& get_source_cloud() const
225 {
226 return m_source_cloud;
227 }
228 [[nodiscard]] const point_cloud_ptr& get_target_cloud() const
229 {
230 return m_target_cloud;
231 }
232 [[nodiscard]] const correspondences_ptr& get_correspondences() const
233 {
234 return m_correspondences;
235 }
236
237 // 数据成员 / Data members
241
242 // 缓存 / Cache
243 bool m_cached = false;
246
247 // 并行计算开关(默认开启) / Parallel computation switch (default enabled)
248 bool m_parallel_enabled = true;
249};
250
251} // namespace toolbox::pcl
对应关系排序器的基类(CRTP模式) / Base class for correspondence sorters (CRTP pattern)
Definition base_correspondence_sorter.hpp:51
base_correspondence_sorter_t & operator=(const base_correspondence_sorter_t &)=delete
base_correspondence_sorter_t(base_correspondence_sorter_t &&)=default
const correspondences_ptr & get_correspondences() const
Definition base_correspondence_sorter.hpp:232
std::vector< std::size_t > sorted_indices_t
Definition base_correspondence_sorter.hpp:57
base_correspondence_sorter_t(const base_correspondence_sorter_t &)=delete
point_cloud_ptr m_source_cloud
Definition base_correspondence_sorter.hpp:238
quality_scores_t compute_quality_scores()
仅计算质量分数,不排序 / Compute quality scores only, without sorting
Definition base_correspondence_sorter.hpp:144
const point_cloud_ptr & get_target_cloud() const
Definition base_correspondence_sorter.hpp:228
void set_correspondences(const correspondences_ptr &correspondences)
设置对应关系 / Set correspondences
Definition base_correspondence_sorter.hpp:87
std::string get_sorter_name_impl() const
派生类必须实现的排序器名称获取方法 / Sorter name getter that derived class must implement
Definition base_correspondence_sorter.hpp:216
const point_cloud_ptr & get_source_cloud() const
获取受保护的成员变量访问 / Get access to protected members
Definition base_correspondence_sorter.hpp:224
base_correspondence_sorter_t & operator=(base_correspondence_sorter_t &&)=default
point_cloud_ptr m_target_cloud
Definition base_correspondence_sorter.hpp:239
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_correspondence_sorter.hpp:54
std::vector< DataType > quality_scores_t
Definition base_correspondence_sorter.hpp:56
bool validate_input_impl() const
派生类可选的额外验证 / Optional additional validation for derived class
Definition base_correspondence_sorter.hpp:209
void enable_parallel(bool enable=true)
启用/禁用并行计算 / Enable/disable parallel computation
Definition base_correspondence_sorter.hpp:175
sorted_indices_t m_cached_indices
Definition base_correspondence_sorter.hpp:245
correspondences_ptr m_correspondences
Definition base_correspondence_sorter.hpp:240
void set_point_clouds(const point_cloud_ptr &source, const point_cloud_ptr &target)
设置源点云和目标点云 / Set source and target point clouds
Definition base_correspondence_sorter.hpp:75
sorted_indices_t compute_sorted_indices(quality_scores_t &scores)
计算质量分数并返回排序后的索引 / Compute quality scores and return sorted indices
Definition base_correspondence_sorter.hpp:101
std::shared_ptr< std::vector< correspondence_t > > correspondences_ptr
Definition base_correspondence_sorter.hpp:55
void clear_cache()
清除缓存 / Clear cache
Definition base_correspondence_sorter.hpp:163
bool is_parallel_enabled() const
获取并行计算状态 / Get parallel computation status
Definition base_correspondence_sorter.hpp:181
quality_scores_t m_cached_scores
Definition base_correspondence_sorter.hpp:244
bool validate_input() const
验证输入数据 / Validate input data
Definition base_correspondence_sorter.hpp:188
std::string get_sorter_name() const
获取排序器名称 / Get sorter name
Definition base_correspondence_sorter.hpp:155
#define LOG_ERROR_S
ERROR级别流式日志的宏 / Macro for ERROR level stream logging.
Definition thread_logger.hpp:1332
#define LOG_WARN_S
WARN级别流式日志的宏 / Macro for WARN level stream logging.
Definition thread_logger.hpp:1331
Definition base_correspondence_generator.hpp:18