FilterDecimateAdaptive.cpp
Go to the documentation of this file.
1 /* -------------------------------------------------------------------------
2  * A repertory of multi primitive-to-primitive (MP2P) ICP algorithms in C++
3  * Copyright (C) 2018-2024 Jose Luis Blanco, University of Almeria
4  * See LICENSE for license information.
5  * ------------------------------------------------------------------------- */
15 #include <mrpt/containers/yaml.h>
16 #include <mrpt/core/round.h>
17 
19  FilterDecimateAdaptive, mp2p_icp_filters::FilterBase, mp2p_icp_filters)
20 
21 using namespace mp2p_icp_filters;
22 
24  const mrpt::containers::yaml& c)
25 {
26  MCP_LOAD_OPT(c, enabled);
27 
28  MCP_LOAD_OPT(c, input_pointcloud_layer);
29  MCP_LOAD_REQ(c, output_pointcloud_layer);
30 
31  MCP_LOAD_REQ(c, desired_output_point_count);
32 
33  MCP_LOAD_OPT(c, assumed_minimum_pointcloud_bbox);
34  MCP_LOAD_OPT(c, maximum_voxel_count_per_dimension);
35  MCP_LOAD_OPT(c, minimum_input_points_per_voxel);
36 }
37 
39 {
40  mrpt::system::COutputLogger::setLoggerName("FilterDecimateAdaptive");
41 }
42 
43 void FilterDecimateAdaptive::initialize(const mrpt::containers::yaml& c)
44 {
45  MRPT_START
46 
47  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
49 
50  MRPT_END
51 }
52 
54 {
55  MRPT_START
56 
57  if (!params_.enabled) return;
58 
59  // In:
60  const auto& pcPtr = inOut.point_layer(params_.input_pointcloud_layer);
61  ASSERTMSG_(
62  pcPtr, mrpt::format(
63  "Input point cloud layer '%s' was not found.",
65 
66  const auto& pc = *pcPtr;
67 
68  // Create if new: Append to existing layer, if already existed.
69  mrpt::maps::CPointsMap::Ptr outPc =
71 
72  const auto& _ = params_; // shortcut
73 
74  outPc->reserve(outPc->size() + _.desired_output_point_count);
75 
76  // Estimate voxel size dynamically from the input cloud:
78 
79  auto inputBbox = pc.boundingBox();
80  auto bboxSize = mrpt::math::TVector3Df(inputBbox.max - inputBbox.min);
81  mrpt::keep_max(bboxSize.x, _.assumed_minimum_pointcloud_bbox);
82  mrpt::keep_max(bboxSize.y, _.assumed_minimum_pointcloud_bbox);
83  mrpt::keep_max(bboxSize.z, _.assumed_minimum_pointcloud_bbox);
84 
85  const float largest_dim = bboxSize.norm(); // diagonal
86 
87  const float voxel_size = largest_dim / _.maximum_voxel_count_per_dimension;
88 
89  // Parse input cloud thru voxelization:
90  filter_grid_.setResolution(voxel_size);
92 
93  struct DataPerVoxel
94  {
95  const PointCloudToVoxelGrid::voxel_t* voxel = nullptr;
96  uint32_t nextIdx = 0;
97  bool exhausted = false;
98  };
99 
100  // A list of all "valid" voxels:
101  std::vector<DataPerVoxel> voxels;
102  voxels.reserve(filter_grid_.size());
103 
104  std::size_t nTotalVoxels = 0;
107  const PointCloudToVoxelGrid::voxel_t& data)
108  {
109  if (!data.indices.empty()) nTotalVoxels++;
110  if (data.indices.size() < _.minimum_input_points_per_voxel) return;
111 
112  voxels.emplace_back().voxel = &data;
113  });
114 
115  // Perform resampling:
116  // -------------------
117  const size_t nVoxels = voxels.size();
118  size_t voxelIdxIncrement = 1;
119  if (params_.desired_output_point_count < nVoxels)
120  {
121  voxelIdxIncrement = std::max<size_t>(
122  1, mrpt::round(
123  nVoxels /
124  static_cast<float>(params_.desired_output_point_count)));
125  }
126 
127  bool anyInsertInTheRound = false;
128 
129  for (size_t i = 0; outPc->size() < params_.desired_output_point_count;)
130  {
131  auto& ith = voxels[i];
132  if (!ith.exhausted)
133  {
134  auto ptIdx = ith.voxel->indices[ith.nextIdx++];
135  outPc->insertPointFrom(pc, ptIdx);
136  anyInsertInTheRound = true;
137 
138  if (ith.nextIdx >= ith.voxel->indices.size()) ith.exhausted = true;
139  }
140 
141  i += voxelIdxIncrement;
142  if (i >= nVoxels)
143  {
144  // one round done.
145  i = (i + 123653 /*a large arbitrary prime*/) % nVoxels;
146 
147  if (!anyInsertInTheRound)
148  {
149  // This means there is no more points and we must end
150  // despite we didn't reached the user's desired number of
151  // points:
152  break;
153  }
154 
155  anyInsertInTheRound = false;
156  }
157  }
158 
159  MRPT_LOG_DEBUG_STREAM(
160  "voxel_size=" << voxel_size << //
161  ", used voxels=" << nTotalVoxels);
162 
163  MRPT_END
164 }
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::desired_output_point_count
unsigned int desired_output_point_count
Definition: FilterDecimateAdaptive.h:54
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterDecimateAdaptive.h:49
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::enabled
bool enabled
Definition: FilterDecimateAdaptive.h:47
mp2p_icp_filters::FilterDecimateAdaptive::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterDecimateAdaptive.cpp:53
mp2p_icp_filters::FilterDecimateAdaptive::params_
Parameters params_
Definition: FilterDecimateAdaptive.h:66
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c)
Definition: FilterDecimateAdaptive.cpp:23
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::maximum_voxel_count_per_dimension
unsigned int maximum_voxel_count_per_dimension
Definition: FilterDecimateAdaptive.h:62
mp2p_icp_filters::PointCloudToVoxelGrid::voxel_t::indices
std::vector< std::size_t > indices
Definition: PointCloudToVoxelGrid.h:59
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::output_pointcloud_layer
std::string output_pointcloud_layer
Definition: FilterDecimateAdaptive.h:52
mp2p_icp_filters::PointCloudToVoxelGrid::indices_t
Definition: PointCloudToVoxelGrid.h:62
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:46
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::assumed_minimum_pointcloud_bbox
double assumed_minimum_pointcloud_bbox
Definition: FilterDecimateAdaptive.h:61
mp2p_icp::metric_map_t::point_layer
mrpt::maps::CPointsMap::Ptr point_layer(const layer_name_t &name) const
Definition: metricmap.cpp:629
mp2p_icp_filters::FilterDecimateAdaptive::FilterDecimateAdaptive
FilterDecimateAdaptive()
Definition: FilterDecimateAdaptive.cpp:38
mp2p_icp_filters::GetOrCreatePointLayer
mrpt::maps::CPointsMap::Ptr GetOrCreatePointLayer(mp2p_icp::metric_map_t &m, const std::string &layerName, bool allowEmptyName=true, const std::string &classForLayerCreation="mrpt::maps::CSimplePointsMap")
Definition: GetOrCreatePointLayer.cpp:15
mp2p_icp_filters::PointCloudToVoxelGrid::voxel_t
Definition: PointCloudToVoxelGrid.h:57
mp2p_icp_filters::PointCloudToVoxelGrid::clear
void clear()
Definition: PointCloudToVoxelGrid.cpp:77
mp2p_icp_filters::PointCloudToVoxelGrid::processPointCloud
void processPointCloud(const mrpt::maps::CPointsMap &p)
Definition: PointCloudToVoxelGrid.cpp:39
FilterDecimateAdaptive.h
An adaptive sampler of pointclouds.
mp2p_icp_filters::FilterDecimateAdaptive::filter_grid_
PointCloudToVoxelGrid filter_grid_
Definition: FilterDecimateAdaptive.h:69
mp2p_icp_filters::PointCloudToVoxelGrid::setResolution
void setResolution(const float voxel_size)
Definition: PointCloudToVoxelGrid.cpp:29
IMPLEMENTS_MRPT_OBJECT
IMPLEMENTS_MRPT_OBJECT(FilterDecimateAdaptive, mp2p_icp_filters::FilterBase, mp2p_icp_filters) using namespace mp2p_icp_filters
GetOrCreatePointLayer.h
Auxiliary function GetOrCreatePointLayer.
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:49
mp2p_icp_filters::PointCloudToVoxelGrid::visit_voxels
void visit_voxels(const std::function< void(const indices_t idx, const voxel_t &vxl)> &userCode) const
Definition: PointCloudToVoxelGrid.cpp:83
mp2p_icp_filters::PointCloudToVoxelGrid::size
size_t size() const
Returns the number of occupied voxels.
Definition: PointCloudToVoxelGrid.cpp:90
mp2p_icp_filters
Definition: FilterAdjustTimestamps.h:19
mp2p_icp_filters::FilterDecimateAdaptive::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterDecimateAdaptive.cpp:43
mp2p_icp_filters::FilterDecimateAdaptive::Parameters::minimum_input_points_per_voxel
unsigned int minimum_input_points_per_voxel
Definition: FilterDecimateAdaptive.h:58


mp2p_icp
Author(s):
autogenerated on Thu Oct 17 2024 02:45:33