cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
prosac_registration.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <chrono>
5#include <cmath>
6#include <random>
7#include <vector>
8
9#include <Eigen/Dense>
10#include <Eigen/SVD>
11
12#include <cpp-toolbox/cpp-toolbox_export.hpp>
14
15namespace toolbox::pcl
16{
17
56template<typename DataType>
57class CPP_TOOLBOX_EXPORT prosac_registration_t
58 : public base_coarse_registration_t<prosac_registration_t<DataType>,
59 DataType>
60{
61 // Allow base class to access protected members
63 DataType>;
64
65public:
66 using base_type =
68 using typename base_type::point_cloud;
69 using typename base_type::point_cloud_ptr;
70 using typename base_type::correspondences_ptr;
71 using typename base_type::result_type;
72 using transformation_t = Eigen::Matrix<DataType, 4, 4>;
73 using vector3_t = Eigen::Matrix<DataType, 3, 1>;
74 using matrix3_t = Eigen::Matrix<DataType, 3, 3>;
75
78
83 void set_confidence(DataType confidence)
84 {
85 m_confidence = std::clamp(confidence, static_cast<DataType>(0.0),
86 static_cast<DataType>(1.0));
87 }
88
93 [[nodiscard]] DataType get_confidence() const { return m_confidence; }
94
99 void set_sample_size(std::size_t size)
100 {
101 m_sample_size = std::max(size, std::size_t(3));
102 }
103
108 [[nodiscard]] std::size_t get_sample_size() const { return m_sample_size; }
109
116 void set_refine_result(bool refine) { m_refine_result = refine; }
117
122 [[nodiscard]] bool get_refine_result() const { return m_refine_result; }
123
130 void set_early_stop_ratio(DataType ratio)
131 {
132 m_early_stop_ratio = std::clamp(ratio, static_cast<DataType>(0.0),
133 static_cast<DataType>(1.0));
134 }
135
140 [[nodiscard]] DataType get_early_stop_ratio() const
141 {
142 return m_early_stop_ratio;
143 }
144
149 void set_initial_inlier_ratio(DataType ratio)
150 {
151 m_initial_inlier_ratio =
152 std::clamp(ratio, static_cast<DataType>(0.01), static_cast<DataType>(0.9));
153 }
154
159 [[nodiscard]] DataType get_initial_inlier_ratio() const
160 {
161 return m_initial_inlier_ratio;
162 }
163
168 void set_non_randomness_threshold(DataType threshold)
169 {
170 m_non_randomness_threshold = threshold;
171 }
172
177 [[nodiscard]] DataType get_non_randomness_threshold() const
178 {
179 return m_non_randomness_threshold;
180 }
181
195 const correspondences_ptr& correspondences,
196 const std::vector<std::size_t>& sorted_indices = {},
197 const std::vector<DataType>& quality_scores = {})
198 {
199 this->set_correspondences(correspondences);
200
201 if (!sorted_indices.empty()) {
202 m_sorted_indices = sorted_indices;
203 } else {
204 // 如果未提供排序索引,假设对应关系已按顺序排序 / If no sorted indices
205 // provided, assume correspondences are already sorted
206 m_sorted_indices.resize(correspondences->size());
207 std::iota(m_sorted_indices.begin(), m_sorted_indices.end(), 0);
208 }
209
210 m_quality_scores = quality_scores;
211 }
212
217 [[nodiscard]] const std::vector<std::size_t>& get_sorted_indices() const
218 {
219 return m_sorted_indices;
220 }
221
222 // Methods needed by base class (must be accessible via friend)
223protected:
230 bool align_impl(result_type& result);
231
236 [[nodiscard]] std::string get_algorithm_name_impl() const { return "PROSAC"; }
237
242 [[nodiscard]] bool validate_input_impl() const;
243
247 void set_correspondences_impl(const correspondences_ptr& /*correspondences*/)
248 {
249 // PROSAC需要排序的对应关系 / PROSAC requires sorted correspondences
250 // 清除之前的排序信息 / Clear previous sorting information
251 m_sorted_indices.clear();
252 m_quality_scores.clear();
253 m_T_n.clear();
254 }
255
256private:
261 void precompute_sampling_schedule(std::size_t n_correspondences);
262
270 void progressive_sample(std::vector<correspondence_t>& sample, std::size_t n,
271 std::size_t t, std::mt19937& generator) const;
272
278 [[nodiscard]] transformation_t estimate_transformation(
279 const std::vector<correspondence_t>& sample) const;
280
287 [[nodiscard]] std::size_t count_inliers(const transformation_t& transform,
288 std::vector<std::size_t>& inliers) const;
289
296 [[nodiscard]] bool check_non_randomness(std::size_t inlier_count,
297 std::size_t n) const;
298
306 [[nodiscard]] bool check_maximality(std::size_t inlier_count, std::size_t n,
307 std::size_t t) const;
308
314 [[nodiscard]] transformation_t
315 refine_transformation(const std::vector<std::size_t>& inlier_indices) const;
316
323 [[nodiscard]] std::size_t compute_binomial_coefficient(std::size_t n,
324 std::size_t k) const;
325
333 [[nodiscard]] DataType compute_beta(std::size_t i, std::size_t m,
334 std::size_t n) const;
335
341 [[nodiscard]] bool is_sample_valid(
342 const std::vector<correspondence_t>& sample) const;
343
350 [[nodiscard]] DataType compute_fitness_score(
351 const transformation_t& transform,
352 const std::vector<std::size_t>& inliers) const;
353
354 // PROSAC特定参数 / PROSAC-specific parameters
355 DataType m_confidence = static_cast<DataType>(0.99);
357 std::size_t m_sample_size = 3;
358 bool m_refine_result = true;
359 DataType m_early_stop_ratio = static_cast<DataType>(
360 0.9);
361 DataType m_initial_inlier_ratio = static_cast<DataType>(
362 0.1);
363 DataType m_non_randomness_threshold = static_cast<DataType>(
364 0.05);
365
366 // 排序信息 / Sorting information
367 std::vector<std::size_t> m_sorted_indices;
368 std::vector<DataType> m_quality_scores;
369
370 // 预计算的采样调度 / Precomputed sampling schedule
371 std::vector<std::size_t> m_T_n;
372
373 // 统计信息 / Statistics
374 mutable std::size_t m_total_samples = 0;
375 mutable std::size_t m_best_inlier_count = 0;
377};
378
379} // namespace toolbox::pcl
380
381// 包含实现文件 / Include implementation file
粗配准算法的基类(CRTP模式) / Base class for coarse registration algorithms (CRTP pattern)
Definition base_coarse_registration.hpp:31
std::shared_ptr< std::vector< correspondence_t > > correspondences_ptr
Definition base_coarse_registration.hpp:35
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_coarse_registration.hpp:34
PROSAC (渐进式采样一致性) 粗配准算法 / PROSAC (Progressive Sample Consensus) coarse registration algorithm.
Definition prosac_registration.hpp:60
DataType get_initial_inlier_ratio() const
获取初始内点率 / Get initial inlier ratio
Definition prosac_registration.hpp:159
DataType get_non_randomness_threshold() const
获取非随机性阈值 / Get non-randomness threshold
Definition prosac_registration.hpp:177
void set_sorted_correspondences(const correspondences_ptr &correspondences, const std::vector< std::size_t > &sorted_indices={}, const std::vector< DataType > &quality_scores={})
设置已排序的对应关系 / Set sorted correspondences
Definition prosac_registration.hpp:194
Eigen::Matrix< DataType, 3, 3 > matrix3_t
Definition prosac_registration.hpp:74
DataType get_confidence() const
获取置信度水平 / Get confidence level
Definition prosac_registration.hpp:93
bool get_refine_result() const
获取是否精炼结果 / Get whether to refine result
Definition prosac_registration.hpp:122
std::string get_algorithm_name_impl() const
获取算法名称实现 / Get algorithm name implementation
Definition prosac_registration.hpp:236
void set_confidence(DataType confidence)
设置置信度水平 / Set confidence level
Definition prosac_registration.hpp:83
void set_sample_size(std::size_t size)
设置最小样本大小 / Set minimum sample size
Definition prosac_registration.hpp:99
std::size_t get_sample_size() const
获取样本大小 / Get sample size
Definition prosac_registration.hpp:108
void set_correspondences_impl(const correspondences_ptr &)
设置对应关系的钩子函数 / Hook function for setting correspondences
Definition prosac_registration.hpp:247
void set_non_randomness_threshold(DataType threshold)
设置非随机性阈值 / Set non-randomness threshold
Definition prosac_registration.hpp:168
void set_refine_result(bool refine)
设置是否使用所有内点精炼结果 / Set whether to refine result using all inliers
Definition prosac_registration.hpp:116
Eigen::Matrix< DataType, 3, 1 > vector3_t
Definition prosac_registration.hpp:73
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition prosac_registration.hpp:72
const std::vector< std::size_t > & get_sorted_indices() const
获取排序后的索引 / Get sorted indices
Definition prosac_registration.hpp:217
void set_early_stop_ratio(DataType ratio)
设置早停阈值(内点比例) / Set early stopping threshold (inlier ratio)
Definition prosac_registration.hpp:130
DataType get_early_stop_ratio() const
获取早停阈值 / Get early stopping threshold
Definition prosac_registration.hpp:140
void set_initial_inlier_ratio(DataType ratio)
设置初始内点率估计 / Set initial inlier ratio estimate
Definition prosac_registration.hpp:149
Definition base_correspondence_generator.hpp:18
配准结果结构体 / Registration result structure
Definition registration_result.hpp:15