cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
mls_keypoints.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cpp-toolbox/cpp-toolbox_export.hpp>
9#include <Eigen/Dense>
10
11namespace toolbox::pcl
12{
13
22template<typename DataType,
23 typename KNN = kdtree_generic_t<point_t<DataType>, toolbox::metrics::L2Metric<DataType>>>
24class CPP_TOOLBOX_EXPORT mls_keypoint_extractor_t
25 : public base_keypoint_extractor_t<mls_keypoint_extractor_t<DataType, KNN>,
26 DataType,
27 KNN>
28{
29public:
31 DataType,
32 KNN>;
34 using knn_type = typename base_type::knn_type;
38
39 // Polynomial order enum
40 enum class polynomial_order_t : int {
41 NONE = 0, // No polynomial fitting, only plane
42 LINEAR = 1, // First order polynomial
43 QUADRATIC = 2 // Second order polynomial
44 };
45
47
48 // Implementation methods for CRTP
49 std::size_t set_input_impl(const point_cloud& cloud);
50 std::size_t set_input_impl(const point_cloud_ptr& cloud);
51 std::size_t set_knn_impl(const knn_type& knn);
52 std::size_t set_search_radius_impl(data_type radius);
53 void enable_parallel_impl(bool enable);
54
55 indices_vector extract_impl();
56 void extract_impl(indices_vector& keypoint_indices);
57 point_cloud extract_keypoints_impl();
58 void extract_keypoints_impl(point_cloud_ptr output);
59
60 // MLS-specific parameters
61 void set_polynomial_order(polynomial_order_t order) { m_polynomial_order = order; }
62 void set_sqr_gauss_param(data_type sqr_gauss_param) { m_sqr_gauss_param = sqr_gauss_param; }
63 void set_compute_curvatures(bool compute) { m_compute_curvatures = compute; }
64 void set_variation_threshold(data_type threshold) { m_variation_threshold = threshold; }
65 void set_curvature_threshold(data_type threshold) { m_curvature_threshold = threshold; }
66 void set_non_maxima_radius(data_type radius) { m_non_maxima_radius = radius; }
67 void set_min_neighbors(std::size_t min_neighbors) { m_min_neighbors = min_neighbors; }
68
69 [[nodiscard]] polynomial_order_t get_polynomial_order() const { return m_polynomial_order; }
70 [[nodiscard]] data_type get_sqr_gauss_param() const { return m_sqr_gauss_param; }
71 [[nodiscard]] bool get_compute_curvatures() const { return m_compute_curvatures; }
72 [[nodiscard]] data_type get_variation_threshold() const { return m_variation_threshold; }
73 [[nodiscard]] data_type get_curvature_threshold() const { return m_curvature_threshold; }
74 [[nodiscard]] data_type get_non_maxima_radius() const { return m_non_maxima_radius; }
75 [[nodiscard]] std::size_t get_min_neighbors() const { return m_min_neighbors; }
76
77 // Structure to hold MLS results for a point
78 struct MLSResult
79 {
80 bool valid;
81 data_type variation; // Surface variation metric
82 data_type curvature; // Mean curvature
83 Eigen::Vector3f normal; // Refined normal
84
85 MLSResult() : valid(false), variation(0), curvature(0), normal(Eigen::Vector3f::Zero()) {}
86 };
87
88private:
89 // Core computation methods
90 MLSResult compute_mls_surface(std::size_t point_idx);
91 std::vector<MLSResult> compute_all_mls_surfaces();
92 indices_vector apply_non_maxima_suppression(const std::vector<MLSResult>& mls_results);
93
94 void compute_mls_range(std::vector<MLSResult>& mls_results,
95 std::size_t start_idx,
96 std::size_t end_idx);
97
98 // Helper methods for polynomial fitting
99 int get_polynomial_coefficients_size() const;
100 void compute_polynomial_coefficients(
101 const std::vector<Eigen::Vector3f>& points,
102 const std::vector<data_type>& weights,
103 const Eigen::Vector3f& mean_point,
104 Eigen::VectorXf& coefficients);
105
106 data_type compute_surface_variation(
107 const std::vector<Eigen::Vector3f>& points,
108 const Eigen::Vector3f& mean_point,
109 const Eigen::VectorXf& coefficients);
110
111 // Member variables
112 bool m_enable_parallel = false;
113 polynomial_order_t m_polynomial_order = polynomial_order_t::QUADRATIC;
114 data_type m_search_radius = static_cast<data_type>(1.0);
115 data_type m_sqr_gauss_param = static_cast<data_type>(0.0); // 0 means radius^2
116 bool m_compute_curvatures = true;
117 data_type m_variation_threshold = static_cast<data_type>(0.001); // Surface variation threshold
118 data_type m_curvature_threshold = static_cast<data_type>(0.1); // Curvature threshold
119 data_type m_non_maxima_radius = static_cast<data_type>(0.5);
120 std::size_t m_min_neighbors = 10;
121
122 point_cloud_ptr m_cloud;
123 knn_type* m_knn = nullptr;
124
125 // Parallel processing threshold
126 static constexpr std::size_t k_parallel_threshold = 1000;
127}; // class mls_keypoint_extractor_t
128
129} // namespace toolbox::pcl
130
Definition vector_metrics.hpp:18
关键点提取器的基类,使用CRTP模式实现静态多态 / Base class for keypoint extractors using CRTP pattern for static polymorph...
Definition base_feature_extractor.hpp:44
DataType data_type
Definition base_feature_extractor.hpp:46
KNN knn_type
Definition base_feature_extractor.hpp:47
std::vector< std::size_t > indices_vector
Definition base_feature_extractor.hpp:50
std::shared_ptr< toolbox::types::point_cloud_t< data_type > > point_cloud_ptr
Definition base_feature_extractor.hpp:49
MLS (Moving Least Squares) 关键点提取器 / MLS (Moving Least Squares) keypoint extractor.
Definition mls_keypoints.hpp:28
typename base_type::data_type data_type
Definition mls_keypoints.hpp:33
void set_sqr_gauss_param(data_type sqr_gauss_param)
Definition mls_keypoints.hpp:62
std::size_t get_min_neighbors() const
Definition mls_keypoints.hpp:75
void set_compute_curvatures(bool compute)
Definition mls_keypoints.hpp:63
polynomial_order_t get_polynomial_order() const
Definition mls_keypoints.hpp:69
void set_variation_threshold(data_type threshold)
Definition mls_keypoints.hpp:64
typename base_type::indices_vector indices_vector
Definition mls_keypoints.hpp:37
data_type get_curvature_threshold() const
Definition mls_keypoints.hpp:73
data_type get_non_maxima_radius() const
Definition mls_keypoints.hpp:74
void set_non_maxima_radius(data_type radius)
Definition mls_keypoints.hpp:66
void set_polynomial_order(polynomial_order_t order)
Definition mls_keypoints.hpp:61
typename base_type::point_cloud point_cloud
Definition mls_keypoints.hpp:35
void set_min_neighbors(std::size_t min_neighbors)
Definition mls_keypoints.hpp:67
typename base_type::point_cloud_ptr point_cloud_ptr
Definition mls_keypoints.hpp:36
data_type get_variation_threshold() const
Definition mls_keypoints.hpp:72
bool get_compute_curvatures() const
Definition mls_keypoints.hpp:71
polynomial_order_t
Definition mls_keypoints.hpp:40
data_type get_sqr_gauss_param() const
Definition mls_keypoints.hpp:70
typename base_type::knn_type knn_type
Definition mls_keypoints.hpp:34
void set_curvature_threshold(data_type threshold)
Definition mls_keypoints.hpp:65
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
Definition base_correspondence_generator.hpp:18
data_type curvature
Definition mls_keypoints.hpp:82
MLSResult()
Definition mls_keypoints.hpp:85
Eigen::Vector3f normal
Definition mls_keypoints.hpp:83
data_type variation
Definition mls_keypoints.hpp:81
bool valid
Definition mls_keypoints.hpp:80