FilterByIntensity.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 
18 
19 using namespace mp2p_icp_filters;
20 
21 void FilterByIntensity::Parameters::load_from_yaml(const mrpt::containers::yaml& c)
22 {
23  MCP_LOAD_REQ(c, input_pointcloud_layer);
24 
25  MCP_LOAD_OPT(c, output_layer_low_intensity);
26  MCP_LOAD_OPT(c, output_layer_high_intensity);
27  MCP_LOAD_OPT(c, output_layer_mid_intensity);
28 
29  ASSERTMSG_(
32  "At least one of 'output_layer_low_intensity' or "
33  "'output_layer_low_intensity' or 'output_layer_mid_intensity' must be "
34  "provided.");
35 
36  MCP_LOAD_REQ(c, low_threshold);
37  MCP_LOAD_REQ(c, high_threshold);
38 }
39 
41 
42 void FilterByIntensity::initialize(const mrpt::containers::yaml& c)
43 {
44  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
46 }
47 
49 {
50  MRPT_START
51 
52  // In:
53  const auto& pcPtr = inOut.point_layer(params_.input_pointcloud_layer);
54  ASSERTMSG_(
55  pcPtr,
56  mrpt::format(
57  "Input point cloud layer '%s' was not found.", params_.input_pointcloud_layer.c_str()));
58 
59  const auto& pc = *pcPtr;
60 
61  // Outputs:
62  // Create if new: Append to existing layer, if already existed.
63  mrpt::maps::CPointsMap::Ptr outLow = GetOrCreatePointLayer(
64  inOut, params_.output_layer_low_intensity, true /*allow empty for nullptr*/,
65  /* create cloud of the same type */
66  pcPtr->GetRuntimeClass()->className);
67 
68  if (outLow) outLow->reserve(outLow->size() + pc.size() / 10);
69 
70  // Create if new: Append to existing layer, if already existed.
71  mrpt::maps::CPointsMap::Ptr outHigh = GetOrCreatePointLayer(
72  inOut, params_.output_layer_high_intensity, true /*allow empty for nullptr*/,
73  /* create cloud of the same type */
74  pcPtr->GetRuntimeClass()->className);
75 
76  if (outHigh) outHigh->reserve(outHigh->size() + pc.size() / 10);
77 
78  // Create if new: Append to existing layer, if already existed.
79  mrpt::maps::CPointsMap::Ptr outMid = GetOrCreatePointLayer(
80  inOut, params_.output_layer_mid_intensity, true /*allow empty for nullptr*/,
81  /* create cloud of the same type */
82  pcPtr->GetRuntimeClass()->className);
83 
84  if (outMid) outMid->reserve(outMid->size() + pc.size() / 10);
85 
86  ASSERTMSG_(
87  outLow || outHigh || outMid,
88  "At least one of 'output_layer_low_intensity' or "
89  "'output_layer_low_intensity' or 'output_layer_mid_intensity' must be "
90  "provided.");
91 
92  const auto& xs = pc.getPointsBufferRef_x();
93  // const auto& ys = pc.getPointsBufferRef_y();
94  // const auto& zs = pc.getPointsBufferRef_z();
95  const auto* ptrI = pc.getPointsBufferRef_intensity();
96  if (!ptrI || ptrI->empty())
97  {
98  THROW_EXCEPTION_FMT(
99  "Error: this filter needs the input layer '%s' to has an "
100  "'intensity' "
101  "point channel.",
103  }
104 
105  const auto& Is = *ptrI;
106  ASSERT_EQUAL_(Is.size(), xs.size());
107  const size_t N = xs.size();
108 
109  size_t countLow = 0, countMid = 0, countHigh = 0;
110 
111  for (size_t i = 0; i < N; i++)
112  {
113  const float I = Is[i];
114 
115  mrpt::maps::CPointsMap* trg = nullptr;
116 
117  if (I < params_.low_threshold)
118  {
119  trg = outLow.get();
120  ++countLow;
121  }
122  else if (I > params_.high_threshold)
123  {
124  trg = outHigh.get();
125  ++countHigh;
126  }
127  else
128  {
129  trg = outMid.get();
130  ++countMid;
131  }
132 
133  if (trg) trg->insertPointFrom(pc, i);
134  }
135 
136  MRPT_LOG_DEBUG_STREAM(
137  "[FilterByIntensity] Input points=" << N << " low=" << countLow << " mid=" << countMid
138  << " high=" << countHigh);
139 
140  MRPT_END
141 }
mp2p_icp_filters::FilterByIntensity::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c)
Definition: FilterByIntensity.cpp:21
mp2p_icp_filters::FilterByIntensity
Definition: FilterByIntensity.h:24
mp2p_icp_filters::FilterByIntensity::Parameters::high_threshold
float high_threshold
Definition: FilterByIntensity.h:55
mp2p_icp_filters::FilterByIntensity::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterByIntensity.h:40
mp2p_icp_filters::FilterByIntensity::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterByIntensity.cpp:42
FilterByIntensity.h
Thresholds an input cloud by intensity values.
IMPLEMENTS_MRPT_OBJECT
IMPLEMENTS_MRPT_OBJECT(FilterDecimateVoxelsQuadratic, mp2p_icp_filters::FilterBase, mp2p_icp_filters) using namespace mp2p_icp_filters
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:46
mp2p_icp_filters::FilterByIntensity::Parameters::output_layer_mid_intensity
std::string output_layer_mid_intensity
Definition: FilterByIntensity.h:52
mp2p_icp::metric_map_t::point_layer
mrpt::maps::CPointsMap::Ptr point_layer(const layer_name_t &name) const
Definition: metricmap.cpp:607
mp2p_icp_filters::FilterByIntensity::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterByIntensity.cpp:48
mp2p_icp_filters::FilterByIntensity::params_
Parameters params_
Definition: FilterByIntensity.h:59
mp2p_icp_filters::FilterByIntensity::Parameters::low_threshold
float low_threshold
Definition: FilterByIntensity.h:54
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
GetOrCreatePointLayer.h
Auxiliary function GetOrCreatePointLayer.
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:55
mp2p_icp_filters::FilterByIntensity::Parameters::output_layer_high_intensity
std::string output_layer_high_intensity
Definition: FilterByIntensity.h:48
mp2p_icp_filters::FilterByIntensity::Parameters::output_layer_low_intensity
std::string output_layer_low_intensity
Definition: FilterByIntensity.h:44
mp2p_icp_filters
Definition: FilterAdjustTimestamps.h:19
mp2p_icp_filters::FilterByIntensity::FilterByIntensity
FilterByIntensity()


mp2p_icp
Author(s):
autogenerated on Mon May 26 2025 02:45:48