cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
sift3d_keypoints.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cpp-toolbox/cpp-toolbox_export.hpp>
8
9namespace toolbox::pcl
10{
11
20template<typename DataType,
21 typename KNN = kdtree_generic_t<point_t<DataType>, toolbox::metrics::L2Metric<DataType>>>
22class CPP_TOOLBOX_EXPORT sift3d_keypoint_extractor_t
23 : public base_keypoint_extractor_t<sift3d_keypoint_extractor_t<DataType, KNN>,
24 DataType,
25 KNN>
26{
27public:
29 DataType,
30 KNN>;
32 using knn_type = typename base_type::knn_type;
36
38
39 // Implementation methods for CRTP
40 std::size_t set_input_impl(const point_cloud& cloud);
41 std::size_t set_input_impl(const point_cloud_ptr& cloud);
42 std::size_t set_knn_impl(const knn_type& knn);
43 std::size_t set_search_radius_impl(data_type radius);
44 void enable_parallel_impl(bool enable);
45
46 indices_vector extract_impl();
47 void extract_impl(indices_vector& keypoint_indices);
48 point_cloud extract_keypoints_impl();
49 void extract_keypoints_impl(point_cloud_ptr output);
50
51 // SIFT3D-specific parameters
52 void set_num_scales(std::size_t num_scales) { m_num_scales = num_scales; }
53 void set_base_scale(data_type scale) { m_base_scale = scale; }
54 void set_scale_factor(data_type factor) { m_scale_factor = factor; }
55 void set_contrast_threshold(data_type threshold) { m_contrast_threshold = threshold; }
56 void set_edge_threshold(data_type threshold) { m_edge_threshold = threshold; }
57 void set_num_neighbors(std::size_t num_neighbors) { m_num_neighbors = num_neighbors; }
58
59 [[nodiscard]] std::size_t get_num_scales() const { return m_num_scales; }
60 [[nodiscard]] data_type get_base_scale() const { return m_base_scale; }
61 [[nodiscard]] data_type get_scale_factor() const { return m_scale_factor; }
62 [[nodiscard]] data_type get_contrast_threshold() const { return m_contrast_threshold; }
63 [[nodiscard]] data_type get_edge_threshold() const { return m_edge_threshold; }
64 [[nodiscard]] std::size_t get_num_neighbors() const { return m_num_neighbors; }
65
66private:
67 struct ScaleSpacePoint
68 {
69 std::size_t point_idx;
70 std::size_t scale_idx;
71 data_type response;
72 bool is_extremum;
73 };
74
75 // Core computation methods
76 std::vector<std::vector<data_type>> build_scale_space();
77 std::vector<ScaleSpacePoint> find_scale_space_extrema(const std::vector<std::vector<data_type>>& scale_space);
78 indices_vector refine_keypoints(const std::vector<ScaleSpacePoint>& extrema);
79 indices_vector remove_edge_responses(const indices_vector& keypoint_indices);
80 void compute_scale_space_range(std::vector<std::vector<data_type>>& scale_space,
81 std::size_t start_idx,
82 std::size_t end_idx);
83
84 // Member variables
85 bool m_enable_parallel = false;
86 std::size_t m_num_scales = 5;
87 data_type m_base_scale = static_cast<data_type>(0.05);
88 data_type m_scale_factor = static_cast<data_type>(1.414); // √2
89 data_type m_contrast_threshold = static_cast<data_type>(0.03);
90 data_type m_edge_threshold = static_cast<data_type>(10.0);
91 std::size_t m_num_neighbors = 20;
92
93 point_cloud_ptr m_cloud;
94 knn_type* m_knn = nullptr;
95
96 // Parallel processing threshold
97 static constexpr std::size_t k_parallel_threshold = 1000;
98}; // class sift3d_keypoint_extractor_t
99
100} // namespace toolbox::pcl
101
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
SIFT 3D (Scale-Invariant Feature Transform) 关键点提取器 / SIFT 3D (Scale-Invariant Feature Transform) keyp...
Definition sift3d_keypoints.hpp:26
void set_scale_factor(data_type factor)
Definition sift3d_keypoints.hpp:54
typename base_type::point_cloud point_cloud
Definition sift3d_keypoints.hpp:33
typename base_type::knn_type knn_type
Definition sift3d_keypoints.hpp:32
typename base_type::point_cloud_ptr point_cloud_ptr
Definition sift3d_keypoints.hpp:34
void set_contrast_threshold(data_type threshold)
Definition sift3d_keypoints.hpp:55
void set_edge_threshold(data_type threshold)
Definition sift3d_keypoints.hpp:56
void set_num_scales(std::size_t num_scales)
Definition sift3d_keypoints.hpp:52
std::size_t get_num_scales() const
Definition sift3d_keypoints.hpp:59
typename base_type::data_type data_type
Definition sift3d_keypoints.hpp:31
void set_num_neighbors(std::size_t num_neighbors)
Definition sift3d_keypoints.hpp:57
std::size_t get_num_neighbors() const
Definition sift3d_keypoints.hpp:64
data_type get_contrast_threshold() const
Definition sift3d_keypoints.hpp:62
data_type get_scale_factor() const
Definition sift3d_keypoints.hpp:61
typename base_type::indices_vector indices_vector
Definition sift3d_keypoints.hpp:35
data_type get_base_scale() const
Definition sift3d_keypoints.hpp:60
data_type get_edge_threshold() const
Definition sift3d_keypoints.hpp:63
void set_base_scale(data_type scale)
Definition sift3d_keypoints.hpp:53
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
Definition base_correspondence_generator.hpp:18