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