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 <optional>
4
5#include <unordered_map>
7
8namespace toolbox::pcl
9{
10
43template<typename DataType>
45 : public four_pcs_registration_t<DataType>
46{
47 // Allow base classes to access protected members
48 friend class base_coarse_registration_t<super_four_pcs_registration_t<DataType>, DataType>;
49 friend class four_pcs_registration_t<DataType>;
50public:
52 using typename base_type::base_4pcs_t;
53 using typename base_type::candidate_t;
54 using typename base_type::point_cloud;
55 using typename base_type::point_cloud_ptr;
56 using typename base_type::result_type;
57 using typename base_type::transformation_t;
58 using typename base_type::vector3_t;
59 using typename base_type::matrix3_t;
60
65 {
66 std::size_t idx1;
67 std::size_t idx2;
68 DataType distance;
69 };
70
75 {
76 std::vector<std::size_t> point_indices;
77 };
78
83 {
84 public:
85 smart_index_t(DataType cell_size) : m_cell_size(cell_size) {}
86
92 void build(const point_cloud_ptr& cloud, const std::vector<std::size_t>& indices);
93
101 [[nodiscard]] std::vector<point_pair_t> find_pairs_in_range(
102 DataType distance, DataType epsilon, std::size_t max_pairs = 1000) const;
103
108 [[nodiscard]] std::string get_statistics() const;
109
110 private:
116 [[nodiscard]] std::tuple<int, int, int> compute_grid_key(const vector3_t& pt) const;
117
124 [[nodiscard]] std::vector<std::tuple<int, int, int>> get_neighbor_cells(
125 const std::tuple<int, int, int>& center_key, int radius) const;
126
127 DataType m_cell_size;
128 std::map<std::tuple<int, int, int>, grid_cell_t> m_grid;
129 point_cloud_ptr m_cloud;
130 vector3_t m_min_bound;
131 vector3_t m_max_bound;
132 };
133
136
141 void set_grid_resolution(DataType resolution) { m_grid_resolution = resolution; }
142
147 [[nodiscard]] DataType get_grid_resolution() const { return m_grid_resolution; }
148
153 void enable_smart_indexing(bool enable) { m_use_smart_indexing = enable; }
154
159 [[nodiscard]] bool is_smart_indexing_enabled() const { return m_use_smart_indexing; }
160
165 void set_pair_distance_epsilon(DataType epsilon) { m_pair_distance_epsilon = epsilon; }
166
171 [[nodiscard]] DataType get_pair_distance_epsilon() const { return m_pair_distance_epsilon; }
172
173protected:
178 [[nodiscard]] std::string get_algorithm_name_impl() const { return "Super4PCS"; }
179
185 bool align_impl(result_type& result);
186
192 [[nodiscard]] std::vector<base_4pcs_t> find_congruent_sets_optimized(
193 const base_4pcs_t& source_base) const;
194
195private:
204 [[nodiscard]] std::vector<point_pair_t> extract_pairs_smart(
205 const std::vector<std::size_t>& indices, const point_cloud_ptr& cloud,
206 DataType distance, DataType epsilon) const;
207
215 [[nodiscard]] std::optional<base_4pcs_t> build_base_from_pairs(
216 const point_pair_t& pair1, const point_pair_t& pair2,
217 const point_cloud_ptr& cloud) const;
218
225 [[nodiscard]] bool verify_pair_compatibility(const point_pair_t& pair1,
226 const point_pair_t& pair2) const;
227
234 [[nodiscard]] DataType compute_adaptive_grid_resolution(
235 const point_cloud_ptr& cloud, const std::vector<std::size_t>& indices) const;
236
237 // Super4PCS特定参数 / Super4PCS-specific parameters
238 DataType m_grid_resolution = 0;
239 bool m_use_smart_indexing = true;
240 DataType m_pair_distance_epsilon = static_cast<DataType>(0.01);
241
242 // 内部数据结构 / Internal data structures
243 mutable std::unique_ptr<smart_index_t> m_source_index;
244 mutable std::unique_ptr<smart_index_t> m_target_index;
245};
246
247} // namespace toolbox::pcl
248
249// 包含实现文件 / 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:83
smart_index_t(DataType cell_size)
Definition super_four_pcs_registration.hpp:85
Super4PCS 粗配准算法 / Super4PCS coarse registration algorithm.
Definition super_four_pcs_registration.hpp:46
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:171
std::string get_algorithm_name_impl() const
获取算法名称实现 / Get algorithm name implementation
Definition super_four_pcs_registration.hpp:178
bool is_smart_indexing_enabled() const
获取是否使用智能索引 / Get whether using smart indexing
Definition super_four_pcs_registration.hpp:159
DataType get_grid_resolution() const
获取网格分辨率 / Get grid resolution
Definition super_four_pcs_registration.hpp:147
void set_pair_distance_epsilon(DataType epsilon)
设置点对距离容差 / Set pair distance tolerance
Definition super_four_pcs_registration.hpp:165
void enable_smart_indexing(bool enable)
启用/禁用智能索引 / Enable/disable smart indexing
Definition super_four_pcs_registration.hpp:153
void set_grid_resolution(DataType resolution)
设置网格分辨率 / Set grid resolution
Definition super_four_pcs_registration.hpp:141
#define CPP_TOOLBOX_EXPORT
Definition export.hpp:8
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:75
std::vector< std::size_t > point_indices
单元内的点索引 / Point indices in cell
Definition super_four_pcs_registration.hpp:76
点对结构 / Point pair structure
Definition super_four_pcs_registration.hpp:65
std::size_t idx1
第一个点的索引 / First point index
Definition super_four_pcs_registration.hpp:66
std::size_t idx2
第二个点的索引 / Second point index
Definition super_four_pcs_registration.hpp:67
DataType distance
点对之间的距离 / Distance between points
Definition super_four_pcs_registration.hpp:68