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


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