cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
four_pcs_registration.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <unordered_map>
5#include <unordered_set>
6
7#include <cpp-toolbox/cpp-toolbox_export.hpp>
10
11namespace toolbox::pcl
12{
13
39template<typename DataType>
40class CPP_TOOLBOX_EXPORT four_pcs_registration_t
41 : public base_coarse_registration_t<four_pcs_registration_t<DataType>, DataType>
42{
43 // Allow base class to access protected members
44 friend class base_coarse_registration_t<four_pcs_registration_t<DataType>, DataType>;
45public:
47 using typename base_type::point_cloud;
48 using typename base_type::point_cloud_ptr;
49 using typename base_type::result_type;
50 using transformation_t = Eigen::Matrix<DataType, 4, 4>;
51 using vector3_t = Eigen::Matrix<DataType, 3, 1>;
52 using matrix3_t = Eigen::Matrix<DataType, 3, 3>;
54
59 {
60 std::array<std::size_t, 4> indices;
61 std::array<vector3_t, 4> points;
62 DataType invariant1;
63 DataType invariant2;
65 DataType d;
66 };
67
79
82
87 void set_delta(DataType delta) { m_delta = std::abs(delta); }
88
93 [[nodiscard]] DataType get_delta() const { return m_delta; }
94
99 void set_overlap(DataType overlap)
100 {
101 m_overlap = std::clamp(overlap, static_cast<DataType>(0.0), static_cast<DataType>(1.0));
102 }
103
108 [[nodiscard]] DataType get_overlap() const { return m_overlap; }
109
114 void set_sample_size(std::size_t size) { m_sample_size = size; }
115
120 [[nodiscard]] std::size_t get_sample_size() const { return m_sample_size; }
121
126 void set_use_normals(bool use_normals) { m_use_normals = use_normals; }
127
132 [[nodiscard]] bool get_use_normals() const { return m_use_normals; }
133
138 void set_max_normal_angle(DataType angle) { m_max_normal_angle = std::abs(angle); }
139
144 [[nodiscard]] DataType get_max_normal_angle() const { return m_max_normal_angle; }
145
150 void set_num_bases(std::size_t num_bases) { m_num_bases = num_bases; }
151
156 [[nodiscard]] std::size_t get_num_bases() const { return m_num_bases; }
157
158 // Methods needed by base class (must be accessible via friend)
159protected:
165 bool align_impl(result_type& result);
166
171 [[nodiscard]] std::string get_algorithm_name_impl() const { return "4PCS"; }
172
177 [[nodiscard]] bool validate_input_impl() const;
178
182 void set_source_impl(const point_cloud_ptr& source);
183
187 void set_target_impl(const point_cloud_ptr& target);
188
192 [[nodiscard]] const std::shared_ptr<kdtree_t>& get_target_kdtree() const { return m_target_kdtree; }
193 [[nodiscard]] const std::vector<std::size_t>& get_source_samples() const { return m_source_samples; }
194 [[nodiscard]] const std::vector<std::size_t>& get_target_samples() const { return m_target_samples; }
195
196protected:
203 void sample_points(const point_cloud_ptr& cloud, std::size_t num_samples,
204 std::vector<std::size_t>& indices);
205
212 [[nodiscard]] bool are_coplanar(const std::array<vector3_t, 4>& points,
213 DataType tolerance) const;
214
219 void compute_invariants(base_4pcs_t& base) const;
220
227 [[nodiscard]] transformation_t estimate_transformation(const base_4pcs_t& source_base,
228 const base_4pcs_t& target_base) const;
229
236 [[nodiscard]] DataType compute_lcp_score(const transformation_t& transform,
237 std::vector<std::size_t>& inliers) const;
238
243 void refine_candidate(candidate_t& candidate) const;
244
252 [[nodiscard]] std::vector<base_4pcs_t> extract_coplanar_bases(
253 const std::vector<std::size_t>& indices, const point_cloud_ptr& cloud,
254 std::size_t num_bases) const;
255
263 [[nodiscard]] std::vector<base_4pcs_t> find_congruent_sets(
264 const base_4pcs_t& source_base, const std::vector<std::size_t>& target_indices,
265 const point_cloud_ptr& target_cloud) const;
266
272 [[nodiscard]] bool is_valid_transformation(const transformation_t& transform) const;
273
274private:
275 // 4PCS特定参数 / 4PCS-specific parameters
276 DataType m_delta = static_cast<DataType>(0.01);
277 DataType m_overlap = static_cast<DataType>(0.5);
278 std::size_t m_sample_size = 200;
279 bool m_use_normals = false;
280 DataType m_max_normal_angle = static_cast<DataType>(0.349);
281 std::size_t m_num_bases = 100;
282
283 // 内部数据结构 / Internal data structures
284 std::shared_ptr<kdtree_t> m_target_kdtree;
285 std::vector<std::size_t> m_source_samples;
286 std::vector<std::size_t> m_target_samples;
287};
288
289} // namespace toolbox::pcl
290
291// 包含实现文件 / 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
std::size_t get_num_bases() const
获取基的数量 / Get number of bases
Definition four_pcs_registration.hpp:156
void set_use_normals(bool use_normals)
设置是否使用法向量信息 / Set whether to use normal information
Definition four_pcs_registration.hpp:126
void set_max_normal_angle(DataType angle)
设置最大法向量偏差角度 / Set maximum normal deviation angle
Definition four_pcs_registration.hpp:138
std::size_t get_sample_size() const
获取采样点数 / Get sample size
Definition four_pcs_registration.hpp:120
void set_num_bases(std::size_t num_bases)
设置基的数量 / Set number of bases to try
Definition four_pcs_registration.hpp:150
bool get_use_normals() const
获取是否使用法向量 / Get whether using normals
Definition four_pcs_registration.hpp:132
DataType get_max_normal_angle() const
获取最大法向量偏差角度 / Get maximum normal deviation angle
Definition four_pcs_registration.hpp:144
DataType get_delta() const
获取配准精度 / Get registration accuracy
Definition four_pcs_registration.hpp:93
std::string get_algorithm_name_impl() const
获取算法名称实现 / Get algorithm name implementation
Definition four_pcs_registration.hpp:171
DataType get_overlap() const
获取重叠率 / Get overlap ratio
Definition four_pcs_registration.hpp:108
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
void set_overlap(DataType overlap)
设置重叠率估计 / Set overlap ratio estimate
Definition four_pcs_registration.hpp:99
void set_delta(DataType delta)
设置配准精度delta / Set registration accuracy delta
Definition four_pcs_registration.hpp:87
const std::vector< std::size_t > & get_target_samples() const
Definition four_pcs_registration.hpp:194
void set_sample_size(std::size_t size)
设置采样点数 / Set number of points to sample
Definition four_pcs_registration.hpp:114
const std::shared_ptr< kdtree_t > & get_target_kdtree() const
获取受保护的成员 / Get protected members
Definition four_pcs_registration.hpp:192
const std::vector< std::size_t > & get_source_samples() const
Definition four_pcs_registration.hpp:193
Definition kdtree.hpp:14
Definition base_correspondence_generator.hpp:18
4点基结构 / 4-point base structure
Definition four_pcs_registration.hpp:59
std::array< std::size_t, 4 > indices
点索引 / Point indices
Definition four_pcs_registration.hpp:60
DataType invariant2
第二个仿射不变量 / Second affine invariant
Definition four_pcs_registration.hpp:63
DataType invariant1
第一个仿射不变量 / First affine invariant
Definition four_pcs_registration.hpp:62
std::array< vector3_t, 4 > points
点坐标 / Point coordinates
Definition four_pcs_registration.hpp:61
DataType d
平面方程参数 / Plane equation parameter
Definition four_pcs_registration.hpp:65
vector3_t normal
平面法向量 / Plane normal
Definition four_pcs_registration.hpp:64
候选匹配结构 / Candidate match structure
Definition four_pcs_registration.hpp:72
std::size_t num_inliers
内点数量 / Number of inliers
Definition four_pcs_registration.hpp:77
base_4pcs_t source_base
源点云基 / Source base
Definition four_pcs_registration.hpp:73
DataType lcp_score
LCP(最大公共点集)评分 / LCP score.
Definition four_pcs_registration.hpp:76
transformation_t transform
估计的变换 / Estimated transformation
Definition four_pcs_registration.hpp:75
base_4pcs_t target_base
目标点云基 / Target base
Definition four_pcs_registration.hpp:74
配准结果结构体 / Registration result structure
Definition registration_result.hpp:15