cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
super_four_pcs_registration.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <unordered_map>
5
6namespace toolbox::pcl
7{
8
41template<typename DataType>
42class CPP_TOOLBOX_EXPORT super_four_pcs_registration_t
43 : public four_pcs_registration_t<DataType>
44{
45 // Allow base classes to access protected members
46 friend class base_coarse_registration_t<super_four_pcs_registration_t<DataType>, DataType>;
47 friend class four_pcs_registration_t<DataType>;
48public:
50 using typename base_type::base_4pcs_t;
51 using typename base_type::candidate_t;
52 using typename base_type::point_cloud;
53 using typename base_type::point_cloud_ptr;
54 using typename base_type::result_type;
55 using typename base_type::transformation_t;
56 using typename base_type::vector3_t;
57 using typename base_type::matrix3_t;
58
63 {
64 std::size_t idx1;
65 std::size_t idx2;
66 DataType distance;
67 };
68
73 {
74 std::vector<std::size_t> point_indices;
75 };
76
81 {
82 public:
83 smart_index_t(DataType cell_size) : m_cell_size(cell_size) {}
84
90 void build(const point_cloud_ptr& cloud, const std::vector<std::size_t>& indices);
91
99 [[nodiscard]] std::vector<point_pair_t> find_pairs_in_range(
100 DataType distance, DataType epsilon, std::size_t max_pairs = 1000) const;
101
106 [[nodiscard]] std::string get_statistics() const;
107
108 private:
114 [[nodiscard]] std::tuple<int, int, int> compute_grid_key(const vector3_t& pt) const;
115
122 [[nodiscard]] std::vector<std::tuple<int, int, int>> get_neighbor_cells(
123 const std::tuple<int, int, int>& center_key, int radius) const;
124
125 DataType m_cell_size;
126 std::map<std::tuple<int, int, int>, grid_cell_t> m_grid;
127 point_cloud_ptr m_cloud;
128 vector3_t m_min_bound;
129 vector3_t m_max_bound;
130 };
131
134
139 void set_grid_resolution(DataType resolution) { m_grid_resolution = resolution; }
140
145 [[nodiscard]] DataType get_grid_resolution() const { return m_grid_resolution; }
146
151 void enable_smart_indexing(bool enable) { m_use_smart_indexing = enable; }
152
157 [[nodiscard]] bool is_smart_indexing_enabled() const { return m_use_smart_indexing; }
158
163 void set_pair_distance_epsilon(DataType epsilon) { m_pair_distance_epsilon = epsilon; }
164
169 [[nodiscard]] DataType get_pair_distance_epsilon() const { return m_pair_distance_epsilon; }
170
171protected:
176 [[nodiscard]] std::string get_algorithm_name_impl() const { return "Super4PCS"; }
177
183 bool align_impl(result_type& result);
184
190 [[nodiscard]] std::vector<base_4pcs_t> find_congruent_sets_optimized(
191 const base_4pcs_t& source_base) const;
192
193private:
202 [[nodiscard]] std::vector<point_pair_t> extract_pairs_smart(
203 const std::vector<std::size_t>& indices, const point_cloud_ptr& cloud,
204 DataType distance, DataType epsilon) const;
205
213 [[nodiscard]] std::optional<base_4pcs_t> build_base_from_pairs(
214 const point_pair_t& pair1, const point_pair_t& pair2,
215 const point_cloud_ptr& cloud) const;
216
223 [[nodiscard]] bool verify_pair_compatibility(const point_pair_t& pair1,
224 const point_pair_t& pair2) const;
225
232 [[nodiscard]] DataType compute_adaptive_grid_resolution(
233 const point_cloud_ptr& cloud, const std::vector<std::size_t>& indices) const;
234
235 // Super4PCS特定参数 / Super4PCS-specific parameters
236 DataType m_grid_resolution = 0;
237 bool m_use_smart_indexing = true;
238 DataType m_pair_distance_epsilon = static_cast<DataType>(0.01);
239
240 // 内部数据结构 / Internal data structures
241 mutable std::unique_ptr<smart_index_t> m_source_index;
242 mutable std::unique_ptr<smart_index_t> m_target_index;
243};
244
245} // namespace toolbox::pcl
246
247// 包含实现文件 / Include implementation file
粗配准算法的基类(CRTP模式) / Base class for coarse registration algorithms (CRTP pattern)
Definition base_coarse_registration.hpp:31
std::shared_ptr< point_cloud > point_cloud_ptr
Definition base_coarse_registration.hpp:34
4PCS(4-Point Congruent Sets)粗配准算法 / 4PCS coarse registration algorithm
Definition four_pcs_registration.hpp:42
Eigen::Matrix< DataType, 3, 1 > vector3_t
Definition four_pcs_registration.hpp:51
Eigen::Matrix< DataType, 3, 3 > matrix3_t
Definition four_pcs_registration.hpp:52
Eigen::Matrix< DataType, 4, 4 > transformation_t
Definition four_pcs_registration.hpp:50
智能索引结构 / Smart index structure
Definition super_four_pcs_registration.hpp:81
smart_index_t(DataType cell_size)
Definition super_four_pcs_registration.hpp:83
Super4PCS 粗配准算法 / Super4PCS coarse registration algorithm.
Definition super_four_pcs_registration.hpp:44
Eigen::Matrix< DataType, 3, 1 > vector3_t
Definition four_pcs_registration.hpp:51
DataType get_pair_distance_epsilon() const
获取点对距离容差 / Get pair distance tolerance
Definition super_four_pcs_registration.hpp:169
std::string get_algorithm_name_impl() const
获取算法名称实现 / Get algorithm name implementation
Definition super_four_pcs_registration.hpp:176
bool is_smart_indexing_enabled() const
获取是否使用智能索引 / Get whether using smart indexing
Definition super_four_pcs_registration.hpp:157
DataType get_grid_resolution() const
获取网格分辨率 / Get grid resolution
Definition super_four_pcs_registration.hpp:145
void set_pair_distance_epsilon(DataType epsilon)
设置点对距离容差 / Set pair distance tolerance
Definition super_four_pcs_registration.hpp:163
void enable_smart_indexing(bool enable)
启用/禁用智能索引 / Enable/disable smart indexing
Definition super_four_pcs_registration.hpp:151
void set_grid_resolution(DataType resolution)
设置网格分辨率 / Set grid resolution
Definition super_four_pcs_registration.hpp:139
Definition base_correspondence_generator.hpp:18
4点基结构 / 4-point base structure
Definition four_pcs_registration.hpp:59
候选匹配结构 / Candidate match structure
Definition four_pcs_registration.hpp:72
配准结果结构体 / Registration result structure
Definition registration_result.hpp:15
3D网格单元 / 3D grid cell
Definition super_four_pcs_registration.hpp:73
std::vector< std::size_t > point_indices
单元内的点索引 / Point indices in cell
Definition super_four_pcs_registration.hpp:74
点对结构 / Point pair structure
Definition super_four_pcs_registration.hpp:63
std::size_t idx1
第一个点的索引 / First point index
Definition super_four_pcs_registration.hpp:64
std::size_t idx2
第二个点的索引 / Second point index
Definition super_four_pcs_registration.hpp:65
DataType distance
点对之间的距离 / Distance between points
Definition super_four_pcs_registration.hpp:66