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-2021 Jose Luis Blanco, University of Almeria
4  * See LICENSE for license information.
5  * ------------------------------------------------------------------------- */
14 #include <mrpt/containers/yaml.h>
15 #include <mrpt/maps/CSimplePointsMap.h>
16 #include <mrpt/math/ops_containers.h> // dotProduct
17 #include <mrpt/obs/CObservation2DRangeScan.h>
18 #include <mrpt/random/RandomGenerators.h>
19 
22 
23 using namespace mp2p_icp_filters;
24 
26  const mrpt::containers::yaml& c)
27 {
28  MCP_LOAD_OPT(c, input_pointcloud_layer);
29  MCP_LOAD_REQ(c, output_pointcloud_layer);
30  MCP_LOAD_REQ(c, keep_bbox_contents);
31 
32  ASSERT_(
33  c.has("bounding_box_min") && c["bounding_box_min"].isSequence() &&
34  c["bounding_box_min"].asSequence().size() == 3);
35  ASSERT_(
36  c.has("bounding_box_max") && c["bounding_box_max"].isSequence() &&
37  c["bounding_box_max"].asSequence().size() == 3);
38 
39  const auto bboxMin = c["bounding_box_min"].toStdVector<double>();
40  const auto bboxMax = c["bounding_box_max"].toStdVector<double>();
41 
42  for (int i = 0; i < 3; i++)
43  {
44  bounding_box.min[i] = bboxMin.at(i);
45  bounding_box.max[i] = bboxMax.at(i);
46  }
47 }
48 
50 
51 void FilterBoundingBox::initialize(const mrpt::containers::yaml& c)
52 {
53  MRPT_START
54 
55  MRPT_LOG_DEBUG_STREAM("Loading these params:\n" << c);
57 
58  MRPT_END
59 }
60 
62 {
63  MRPT_START
64 
65  // In:
66  const auto pcPtr = inOut.point_layer(params_.input_pointcloud_layer);
67  ASSERTMSG_(
68  pcPtr, mrpt::format(
69  "Input point cloud layer '%s' was not found.",
71 
72  const auto& pc = *pcPtr;
73 
74  // Out:
75  ASSERT_(!params_.output_pointcloud_layer.empty());
76 
77  // Create if new: Append to existing layer, if already existed.
78  mrpt::maps::CPointsMap::Ptr outPc;
79  if (auto itLy = inOut.layers.find(params_.output_pointcloud_layer);
80  itLy != inOut.layers.end())
81  {
82  outPc = std::dynamic_pointer_cast<mrpt::maps::CPointsMap>(itLy->second);
83  if (!outPc)
84  THROW_EXCEPTION_FMT(
85  "Layer '%s' must be of point cloud type.",
87  }
88  else
89  {
90  outPc = mrpt::maps::CSimplePointsMap::Create();
91  inOut.layers[params_.output_pointcloud_layer] = outPc;
92  }
93 
94  outPc->reserve(outPc->size() + pc.size() / 10);
95 
96  const auto& xs = pc.getPointsBufferRef_x();
97  const auto& ys = pc.getPointsBufferRef_y();
98  const auto& zs = pc.getPointsBufferRef_z();
99 
100  for (size_t i = 0; i < xs.size(); i++)
101  {
102  const bool isInside =
103  params_.bounding_box.containsPoint({xs[i], ys[i], zs[i]});
104 
105  if ((isInside && !params_.keep_bbox_contents) ||
106  (!isInside && params_.keep_bbox_contents))
107  continue; // remove this point.
108 
109  // Otherwise, add it:
110  outPc->insertPointFast(xs[i], ys[i], zs[i]);
111  }
112 
113  MRPT_END
114 }
mp2p_icp_filters::FilterBoundingBox::Parameters::output_pointcloud_layer
std::string output_pointcloud_layer
Definition: FilterBoundingBox.h:45
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::initialize
void initialize(const mrpt::containers::yaml &c) override
Definition: FilterBoundingBox.cpp:51
mp2p_icp_filters::FilterBoundingBox::Parameters::keep_bbox_contents
bool keep_bbox_contents
Definition: FilterBoundingBox.h:57
mp2p_icp_filters::FilterBoundingBox::Parameters::load_from_yaml
void load_from_yaml(const mrpt::containers::yaml &c)
Definition: FilterBoundingBox.cpp:25
mp2p_icp_filters::FilterBoundingBox::filter
void filter(mp2p_icp::metric_map_t &inOut) const override
Definition: FilterBoundingBox.cpp:61
mp2p_icp_filters::FilterBase
Definition: FilterBase.h:37
mp2p_icp::metric_map_t::point_layer
mrpt::maps::CPointsMap::Ptr point_layer(const layer_name_t &name) const
Definition: metricmap.cpp:483
mp2p_icp_filters::FilterBoundingBox::Parameters::bounding_box
mrpt::math::TBoundingBoxf bounding_box
Definition: FilterBoundingBox.h:54
mp2p_icp_filters::FilterBoundingBox::FilterBoundingBox
FilterBoundingBox()
mp2p_icp_filters::FilterBoundingBox::params_
Parameters params_
Definition: FilterBoundingBox.h:61
mp2p_icp::metric_map_t
Generic container of pointcloud(s), extracted features and other maps.
Definition: metricmap.h:47
mp2p_icp::metric_map_t::layers
std::map< layer_name_t, mrpt::maps::CMetricMap::Ptr > layers
Definition: metricmap.h:74
mp2p_icp_filters
Definition: FilterBase.h:25
mp2p_icp_filters::FilterBoundingBox::Parameters::input_pointcloud_layer
std::string input_pointcloud_layer
Definition: FilterBoundingBox.h:41


mrpt_local_obstacles
Author(s): Jose-Luis Blanco-Claraco
autogenerated on Mon Aug 14 2023 02:09:02