FilterBoundingBox.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/math/ops_containers.h> // dotProduct
17 
19 
20 using namespace mp2p_icp_filters;
21 
23  const mrpt::containers::yaml& c, FilterBoundingBox& parent)
24 {
25  MCP_LOAD_OPT(c, input_pointcloud_layer);
26  MCP_LOAD_OPT(c, inside_pointcloud_layer);
27  MCP_LOAD_OPT(c, outside_pointcloud_layer);
28 
29  ASSERTMSG_(
31  "At least one 'inside_pointcloud_layer' or "
32  "'outside_pointcloud_layer' must be provided.");
33 
34  ASSERT_(
35  c.has("bounding_box_min") && c["bounding_box_min"].isSequence() &&
36  c["bounding_box_min"].asSequence().size() == 3);
37  ASSERT_(
38  c.has("bounding_box_max") && c["bounding_box_max"].isSequence() &&
39  c["bounding_box_max"].asSequence().size() == 3);
40 
41  const auto bboxMin = c["bounding_box_min"].asSequence();
42  const auto bboxMax = c["bounding_box_max"].asSequence();
43 
44  for (int i = 0; i < 3; i++)
45  {
46  parent.parseAndDeclareParameter(bboxMin.at(i).as<std::string>(), bounding_box.min[i]);
47  parent.parseAndDeclareParameter(bboxMax.at(i).as<std::string>(), bounding_box.max[i]);
48  }
49 }
50 
52 {
53  mrpt::system::COutputLogger::setLoggerName("FilterBoundingBox");
54 }
55 
56 void FilterBoundingBox::initialize(const mrpt::containers::yaml& c)
57 {
58  MRPT_START
59 
60  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
61  params_.load_from_yaml(c, *this);
62 
63  MRPT_END
64 }
65 
67 {
68  MRPT_START
69 
70  // In:
71  const auto pcPtr = inOut.point_layer(params_.input_pointcloud_layer);
72  ASSERTMSG_(
73  pcPtr,
74  mrpt::format(
75  "Input point cloud layer '%s' was not found.", params_.input_pointcloud_layer.c_str()));
76 
77  const auto& pc = *pcPtr;
78 
79  // Create if new: Append to existing layer, if already existed.
80  mrpt::maps::CPointsMap::Ptr insidePc = GetOrCreatePointLayer(
81  inOut, params_.inside_pointcloud_layer, true /*allow empty for nullptr*/,
82  /* create cloud of the same type */
83  pcPtr->GetRuntimeClass()->className);
84 
85  if (insidePc) insidePc->reserve(insidePc->size() + pc.size() / 10);
86 
87  mrpt::maps::CPointsMap::Ptr outsidePc = GetOrCreatePointLayer(
88  inOut, params_.outside_pointcloud_layer, true /*allow empty for nullptr*/,
89  /* create cloud of the same type */
90  pcPtr->GetRuntimeClass()->className);
91 
92  if (outsidePc) outsidePc->reserve(outsidePc->size() + pc.size() / 10);
93 
94  const auto& xs = pc.getPointsBufferRef_x();
95  const auto& ys = pc.getPointsBufferRef_y();
96  const auto& zs = pc.getPointsBufferRef_z();
97 
98  for (size_t i = 0; i < xs.size(); i++)
99  {
100  const bool isInside = params_.bounding_box.containsPoint({xs[i], ys[i], zs[i]});
101 
102  auto* targetPc = isInside ? insidePc.get() : outsidePc.get();
103 
104  if (targetPc) targetPc->insertPointFrom(pc, i);
105  }
106 
107  MRPT_END
108 }
FilterBoundingBox.h
Leaves or removes the points in a given bounding box.
mp2p_icp_filters::FilterBoundingBox::Parameters::inside_pointcloud_layer
std::string inside_pointcloud_layer
Definition: FilterBoundingBox.h:49
mp2p_icp_filters::FilterBoundingBox::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterBoundingBox.cpp:56
mp2p_icp_filters::FilterBoundingBox::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterBoundingBox.cpp:66
mp2p_icp_filters::FilterBoundingBox::Parameters::outside_pointcloud_layer
std::string outside_pointcloud_layer
Definition: FilterBoundingBox.h:52
testing::internal::string
::std::string string
Definition: gtest.h:1979
IMPLEMENTS_MRPT_OBJECT
IMPLEMENTS_MRPT_OBJECT(FilterDecimateVoxelsQuadratic, mp2p_icp_filters::FilterBase, mp2p_icp_filters) using namespace mp2p_icp_filters
mp2p_icp_filters::FilterBoundingBox::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c, FilterBoundingBox &parent)
Definition: FilterBoundingBox.cpp:22
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:46
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::FilterBoundingBox::Parameters::bounding_box
mrpt::math::TBoundingBoxf bounding_box
Definition: FilterBoundingBox.h:61
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::FilterBoundingBox::FilterBoundingBox
FilterBoundingBox()
Definition: FilterBoundingBox.cpp:51
mp2p_icp_filters::FilterBoundingBox::params_
Parameters params_
Definition: FilterBoundingBox.h:65
mp2p_icp::Parameterizable::parseAndDeclareParameter
void parseAndDeclareParameter(const std::string &value, double &target)
Definition: Parameterizable.cpp:120
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::FilterBoundingBox
Definition: FilterBoundingBox.h:30
mp2p_icp_filters
Definition: FilterAdjustTimestamps.h:19
mp2p_icp_filters::FilterBoundingBox::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterBoundingBox.h:46


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