cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
voxel_grid_downsampling.hpp
Go to the documentation of this file.
1#pragma once
2
6
7namespace toolbox::pcl
8{
9
10template<typename DataType>
11class CPP_TOOLBOX_EXPORT voxel_grid_downsampling_t
12 : public filter_t<voxel_grid_downsampling_t<DataType>, DataType>
13{
14public:
15 using data_type = DataType;
19 std::shared_ptr<toolbox::types::point_cloud_t<data_type>>;
20 // 体素坐标键类型 - 使用整数代替元组以提高性能
21 using voxel_key_t = std::uint64_t;
22
23 // 体素数据的SoA (Structure of Arrays)结构
25 {
26 // 点坐标和累加值
27 std::vector<DataType> sum_x;
28 std::vector<DataType> sum_y;
29 std::vector<DataType> sum_z;
30
31 // 法线累加值
32 std::vector<DataType> sum_nx;
33 std::vector<DataType> sum_ny;
34 std::vector<DataType> sum_nz;
35
36 // 颜色累加值
37 std::vector<DataType> sum_r;
38 std::vector<DataType> sum_g;
39 std::vector<DataType> sum_b;
40
41 // 计数和索引映射
42 std::vector<std::size_t> counts;
43 std::vector<std::size_t> voxel_indices; // 用于从体素索引映射到输出点云索引
44
45 // 添加新体素
46 std::size_t add_voxel();
47
48 // 获取体素数量
49 [[nodiscard]] std::size_t size() const;
50
51 // 预分配内存
52 void reserve(std::size_t reserve_size);
53
54 // 清空数据
55 void clear();
56 };
57
58 // 哈希函数定义
59 struct key_hash
60 {
61 std::size_t operator()(const voxel_key_t& key) const noexcept;
62 };
63
64 explicit voxel_grid_downsampling_t(float voxel_size)
65 : m_voxel_size(voxel_size)
66 {
67 }
69
70 // 禁用拷贝和移动
73 delete;
76
77 // 实现接口方法
78 std::size_t set_input_impl(const point_cloud& cloud);
79 std::size_t set_input_impl(const point_cloud_ptr& cloud);
80 void enable_parallel_impl(bool enable);
81 point_cloud filter_impl();
82 void filter_impl(point_cloud_ptr output);
83
84private:
85 // 处理点云数据,将点添加到体素中
86 void process_point(
87 std::size_t idx,
88 std::unordered_map<voxel_key_t, std::size_t, key_hash>& voxel_map,
89 voxel_data_soa_t& voxel_data);
90
91 // 合并多个线程的体素数据
92 void merge_thread_data(
93 const std::vector<std::unordered_map<voxel_key_t, std::size_t, key_hash>>&
94 thread_maps,
95 const std::vector<voxel_data_soa_t>& thread_data,
96 std::unordered_map<voxel_key_t, std::size_t, key_hash>& merged_map,
97 voxel_data_soa_t& merged_data);
98
99 // 计算点云边界,用于优化体素索引计算
100 void compute_point_cloud_bounds();
101
102 // 计算体素键值
103 [[nodiscard]] voxel_key_t compute_voxel_key(int ix, int iy, int iz) const;
104
105 // 估计体素数量
106 [[nodiscard]] std::size_t estimate_voxel_count() const;
107
108 // 成员变量
109 float m_voxel_size = 1.0F;
110 bool m_enable_parallel = false;
111 point_cloud_ptr m_cloud;
112
113 // 点云边界相关变量
114 bool m_bounds_computed = false;
115 int m_min_ix = 0, m_min_iy = 0, m_min_iz = 0;
116 int m_max_ix = 0, m_max_iy = 0, m_max_iz = 0;
117 int m_span_x = 0, m_span_y = 0; // 用于快速计算键值
118};
119
120} // namespace toolbox::pcl
121
Definition filters.hpp:13
Definition voxel_grid_downsampling.hpp:13
voxel_grid_downsampling_t & operator=(const voxel_grid_downsampling_t &)=delete
voxel_grid_downsampling_t(voxel_grid_downsampling_t &&)=delete
std::uint64_t voxel_key_t
Definition voxel_grid_downsampling.hpp:21
voxel_grid_downsampling_t & operator=(voxel_grid_downsampling_t &&)=delete
DataType data_type
Definition voxel_grid_downsampling.hpp:15
voxel_grid_downsampling_t(const voxel_grid_downsampling_t &)=delete
voxel_grid_downsampling_t(float voxel_size)
Definition voxel_grid_downsampling.hpp:64
std::shared_ptr< toolbox::types::point_cloud_t< data_type > > point_cloud_ptr
Definition voxel_grid_downsampling.hpp:19
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
Definition base_correspondence_generator.hpp:18
Definition voxel_grid_downsampling.hpp:60
Definition voxel_grid_downsampling.hpp:25
std::vector< DataType > sum_g
Definition voxel_grid_downsampling.hpp:38
std::vector< DataType > sum_b
Definition voxel_grid_downsampling.hpp:39
std::vector< DataType > sum_r
Definition voxel_grid_downsampling.hpp:37
std::vector< DataType > sum_z
Definition voxel_grid_downsampling.hpp:29
std::vector< std::size_t > voxel_indices
Definition voxel_grid_downsampling.hpp:43
std::vector< std::size_t > counts
Definition voxel_grid_downsampling.hpp:42
std::vector< DataType > sum_nz
Definition voxel_grid_downsampling.hpp:34
std::vector< DataType > sum_nx
Definition voxel_grid_downsampling.hpp:32
std::vector< DataType > sum_y
Definition voxel_grid_downsampling.hpp:28
std::vector< DataType > sum_ny
Definition voxel_grid_downsampling.hpp:33
std::vector< DataType > sum_x
Definition voxel_grid_downsampling.hpp:27