cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
correspondence.hpp
Go to the documentation of this file.
1#pragma once
2
44#include <memory>
45#include <vector>
46
47// Logger macros
48#define LOG_INFO_S toolbox::logger::thread_logger_t::instance().info_s()
49
50namespace toolbox::pcl
51{
52
111template<typename DataType, typename Signature, typename KNN>
112std::vector<correspondence_t> generate_correspondences_knn(
113 const std::shared_ptr<toolbox::types::point_cloud_t<DataType>>& src_cloud,
114 const std::shared_ptr<std::vector<Signature>>& src_descriptors,
115 const std::shared_ptr<std::vector<std::size_t>>& src_keypoints,
116 const std::shared_ptr<toolbox::types::point_cloud_t<DataType>>& dst_cloud,
117 const std::shared_ptr<std::vector<Signature>>& dst_descriptors,
118 const std::shared_ptr<std::vector<std::size_t>>& dst_keypoints,
119 float ratio = 0.8f,
120 bool mutual = true)
121{
123
124 auto knn = std::make_shared<KNN>();
125 gen.set_knn(knn);
126 gen.set_source(src_cloud, src_descriptors, src_keypoints);
127 gen.set_destination(dst_cloud, dst_descriptors, dst_keypoints);
128 gen.set_ratio(ratio);
129 gen.set_mutual_verification(mutual);
130
131 std::vector<correspondence_t> correspondences;
132 gen.compute(correspondences);
133
134 return correspondences;
135}
136
160template<typename DataType, typename Signature>
161std::vector<correspondence_t> generate_correspondences_brute_force(
162 const std::shared_ptr<toolbox::types::point_cloud_t<DataType>>& src_cloud,
163 const std::shared_ptr<std::vector<Signature>>& src_descriptors,
164 const std::shared_ptr<std::vector<std::size_t>>& src_keypoints,
165 const std::shared_ptr<toolbox::types::point_cloud_t<DataType>>& dst_cloud,
166 const std::shared_ptr<std::vector<Signature>>& dst_descriptors,
167 const std::shared_ptr<std::vector<std::size_t>>& dst_keypoints,
168 float ratio = 0.8f,
169 bool mutual = true,
170 bool parallel = false)
171{
173
174 gen.enable_parallel(parallel);
175 gen.set_source(src_cloud, src_descriptors, src_keypoints);
176 gen.set_destination(dst_cloud, dst_descriptors, dst_keypoints);
177 gen.set_ratio(ratio);
178 gen.set_mutual_verification(mutual);
179
180 std::vector<correspondence_t> correspondences;
181 gen.compute(correspondences);
182
183 return correspondences;
184}
185
199 std::vector<correspondence_t>& correspondences,
200 float max_distance)
201{
202 size_t original_size = correspondences.size();
203
204 correspondences.erase(
205 std::remove_if(correspondences.begin(), correspondences.end(),
206 [max_distance](const correspondence_t& corr) {
207 return corr.distance > max_distance;
208 }),
209 correspondences.end());
210
211 return original_size - correspondences.size();
212}
213
227inline std::tuple<float, float, float, float> compute_correspondence_statistics(
228 const std::vector<correspondence_t>& correspondences)
229{
230 if (correspondences.empty()) {
231 return {0.0f, 0.0f, 0.0f, 0.0f};
232 }
233
234 float sum = 0.0f;
235 float min_dist = std::numeric_limits<float>::max();
236 float max_dist = std::numeric_limits<float>::lowest();
237
238 for (const auto& corr : correspondences) {
239 sum += corr.distance;
240 min_dist = std::min(min_dist, corr.distance);
241 max_dist = std::max(max_dist, corr.distance);
242 }
243
244 float mean = sum / correspondences.size();
245
246 float variance = 0.0f;
247 for (const auto& corr : correspondences) {
248 float diff = corr.distance - mean;
249 variance += diff * diff;
250 }
251 variance /= correspondences.size();
252 float std_dev = std::sqrt(variance);
253
254 return {mean, std_dev, min_dist, max_dist};
255}
256
268 const std::vector<correspondence_t>& correspondences,
269 size_t max_display = 10)
270{
271 LOG_INFO_S << "对应关系数量 / Number of correspondences: " << correspondences.size();
272
273 size_t count = std::min(max_display, correspondences.size());
274 for (size_t i = 0; i < count; ++i) {
275 const auto& corr = correspondences[i];
276 LOG_INFO_S << " [" << i << "] " << corr.src_idx << " <-> " << corr.dst_idx
277 << ", 距离 / distance = " << corr.distance;
278 }
279
280 if (correspondences.size() > max_display) {
281 LOG_INFO_S << " ... 还有 / and " << (correspondences.size() - max_display)
282 << " 个对应关系 / more correspondences";
283 }
284}
285
// end of correspondence group
287
288} // namespace toolbox::pcl
void set_destination(const point_cloud_ptr &dst_cloud, const signatures_ptr &dst_descriptors, const keypoint_indices_ptr &dst_keypoint_indices)
设置目标数据 / Set destination data
Definition base_correspondence_generator.hpp:98
void set_ratio(float ratio)
设置比率测试阈值 / Set ratio test threshold
Definition base_correspondence_generator.hpp:111
void set_source(const point_cloud_ptr &src_cloud, const signatures_ptr &src_descriptors, const keypoint_indices_ptr &src_keypoint_indices)
设置源数据 / Set source data
Definition base_correspondence_generator.hpp:83
void compute(std::vector< correspondence_t > &correspondences)
计算对应关系 / Compute correspondences
Definition base_correspondence_generator.hpp:153
void set_mutual_verification(bool mutual_verification)
设置是否启用双向验证 / Set whether to enable mutual verification
Definition base_correspondence_generator.hpp:123
暴力搜索对应点生成器 / Brute-force correspondence generator
Definition brute_force_correspondence_generator.hpp:42
void enable_parallel(bool enable)
启用或禁用并行计算 / Enable or disable parallel computation
Definition brute_force_correspondence_generator.hpp:56
基于KNN的对应点生成器 / KNN-based correspondence generator
Definition knn_correspondence_generator.hpp:50
void set_knn(std::shared_ptr< KNN > knn)
设置KNN搜索算法 / Set KNN search algorithm
Definition knn_correspondence_generator.hpp:64
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
#define LOG_INFO_S
INFO级别流式日志的宏 / Macro for INFO level stream logging.
Definition thread_logger.hpp:1330
size_t filter_correspondences_by_distance(std::vector< correspondence_t > &correspondences, float max_distance)
过滤对应关系的辅助函数 / Helper function to filter correspondences
Definition correspondence.hpp:198
void print_correspondences(const std::vector< correspondence_t > &correspondences, size_t max_display=10)
可视化对应关系的辅助信息 / Helper to visualize correspondence information
Definition correspondence.hpp:267
std::vector< correspondence_t > generate_correspondences_brute_force(const std::shared_ptr< toolbox::types::point_cloud_t< DataType > > &src_cloud, const std::shared_ptr< std::vector< Signature > > &src_descriptors, const std::shared_ptr< std::vector< std::size_t > > &src_keypoints, const std::shared_ptr< toolbox::types::point_cloud_t< DataType > > &dst_cloud, const std::shared_ptr< std::vector< Signature > > &dst_descriptors, const std::shared_ptr< std::vector< std::size_t > > &dst_keypoints, float ratio=0.8f, bool mutual=true, bool parallel=false)
快速生成对应关系的便捷函数(使用暴力搜索) / Convenience function for quick correspondence generation (using brute force)
Definition correspondence.hpp:161
std::tuple< float, float, float, float > compute_correspondence_statistics(const std::vector< correspondence_t > &correspondences)
计算对应关系的统计信息 / Compute statistics of correspondences
Definition correspondence.hpp:227
std::vector< correspondence_t > generate_correspondences_knn(const std::shared_ptr< toolbox::types::point_cloud_t< DataType > > &src_cloud, const std::shared_ptr< std::vector< Signature > > &src_descriptors, const std::shared_ptr< std::vector< std::size_t > > &src_keypoints, const std::shared_ptr< toolbox::types::point_cloud_t< DataType > > &dst_cloud, const std::shared_ptr< std::vector< Signature > > &dst_descriptors, const std::shared_ptr< std::vector< std::size_t > > &dst_keypoints, float ratio=0.8f, bool mutual=true)
对应关系生成策略 / Correspondence generation strategies
Definition correspondence.hpp:112
Definition base_correspondence_generator.hpp:18
对应关系结构体 / Correspondence structure
Definition base_correspondence_generator.hpp:27