cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
ransac_registration.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <chrono>
5#include <random>
6#include <vector>
7
8#include <Eigen/Dense>
9#include <Eigen/SVD>
10
11#include <cpp-toolbox/cpp-toolbox_export.hpp>
13
14namespace toolbox::pcl
15{
16
43template<typename DataType>
44class CPP_TOOLBOX_EXPORT ransac_registration_t
45 : public base_coarse_registration_t<ransac_registration_t<DataType>, DataType>
46{
47 // Allow base class to access protected members
48 friend class base_coarse_registration_t<ransac_registration_t<DataType>, DataType>;
49public:
51 using typename base_type::point_cloud;
52 using typename base_type::point_cloud_ptr;
53 using typename base_type::correspondences_ptr;
54 using typename base_type::result_type;
55 using transformation_t = Eigen::Matrix<DataType, 4, 4>;
56 using vector3_t = Eigen::Matrix<DataType, 3, 1>;
57 using matrix3_t = Eigen::Matrix<DataType, 3, 3>;
58
61
66 void set_confidence(DataType confidence)
67 {
68 m_confidence = std::clamp(confidence, static_cast<DataType>(0.0),
69 static_cast<DataType>(1.0));
70 }
71
76 [[nodiscard]] DataType get_confidence() const { return m_confidence; }
77
82 void set_sample_size(std::size_t size) { m_sample_size = std::max(size, std::size_t(3)); }
83
88 [[nodiscard]] std::size_t get_sample_size() const { return m_sample_size; }
89
96 void set_refine_result(bool refine) { m_refine_result = refine; }
97
102 [[nodiscard]] bool get_refine_result() const { return m_refine_result; }
103
108 void set_early_stop_ratio(DataType ratio)
109 {
110 m_early_stop_ratio = std::clamp(ratio, static_cast<DataType>(0.0),
111 static_cast<DataType>(1.0));
112 }
113
118 [[nodiscard]] DataType get_early_stop_ratio() const { return m_early_stop_ratio; }
119
120 // Methods needed by base class (must be accessible via friend)
121protected:
128 bool align_impl(result_type& result);
129
134 [[nodiscard]] std::string get_algorithm_name_impl() const { return "RANSAC"; }
135
140 [[nodiscard]] bool validate_input_impl() const;
141
145 void set_correspondences_impl(const correspondences_ptr& /*correspondences*/)
146 {
147 // RANSAC需要对应关系,这里可以添加额外的处理
148 // RANSAC requires correspondences, additional processing can be added here
149 }
150
151private:
157 [[nodiscard]] std::size_t calculate_iterations(DataType outlier_ratio) const;
158
164 void sample_correspondences(std::vector<correspondence_t>& sample,
165 std::mt19937& generator) const;
166
172 [[nodiscard]] transformation_t
173 estimate_rigid_transform_svd(const std::vector<correspondence_t>& sample) const;
174
181 [[nodiscard]] std::size_t count_inliers(const transformation_t& transform,
182 std::vector<std::size_t>& inliers) const;
183
189 [[nodiscard]] transformation_t
190 refine_transformation(const std::vector<std::size_t>& inlier_indices) const;
191
198 [[nodiscard]] DataType compute_fitness_score(const transformation_t& transform,
199 const std::vector<std::size_t>& inliers) const;
200
201 // RANSAC特定参数 / RANSAC-specific parameters
202 DataType m_confidence = static_cast<DataType>(0.99);
203 std::size_t m_sample_size = 3;
204 bool m_refine_result = true;
205 DataType m_early_stop_ratio =
206 static_cast<DataType>(0.9);
207};
208
209} // namespace toolbox::pcl
210
211// 包含实现文件 / 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
RANSAC粗配准算法 / RANSAC coarse registration algorithm.
Definition ransac_registration.hpp:46
void set_correspondences_impl(const correspondences_ptr &)
设置对应关系的钩子函数 / Hook function for setting correspondences
Definition ransac_registration.hpp:145
Eigen::Matrix< DataType, 3, 1 > vector3_t
Definition ransac_registration.hpp:56
DataType get_early_stop_ratio() const
获取早停阈值 / Get early stopping threshold
Definition ransac_registration.hpp:118
Eigen::Matrix< DataType, 3, 3 > matrix3_t
Definition ransac_registration.hpp:57
std::size_t get_sample_size() const
获取样本大小 / Get sample size
Definition ransac_registration.hpp:88
void set_sample_size(std::size_t size)
设置最小样本大小 / Set minimum sample size
Definition ransac_registration.hpp:82
void set_confidence(DataType confidence)
设置置信度水平 / Set confidence level
Definition ransac_registration.hpp:66
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition ransac_registration.hpp:55
DataType get_confidence() const
获取置信度水平 / Get confidence level
Definition ransac_registration.hpp:76
bool get_refine_result() const
获取是否精炼结果 / Get whether to refine result
Definition ransac_registration.hpp:102
void set_early_stop_ratio(DataType ratio)
设置早停阈值(内点比例) / Set early stopping threshold (inlier ratio)
Definition ransac_registration.hpp:108
void set_refine_result(bool refine)
设置是否使用所有内点精炼结果 / Set whether to refine result using all inliers
Definition ransac_registration.hpp:96
std::string get_algorithm_name_impl() const
获取算法名称实现 / Get algorithm name implementation
Definition ransac_registration.hpp:134
Definition base_correspondence_generator.hpp:18
配准结果结构体 / Registration result structure
Definition registration_result.hpp:15