Point Cloud Library (PCL) 1.15.0
Loading...
Searching...
No Matches
crop_hull.h
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2011, Willow Garage, Inc.
6 *
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following
17 * disclaimer in the documentation and/or other materials provided
18 * with the distribution.
19 * * Neither the name of the copyright holder(s) nor the names of its
20 * contributors may be used to endorse or promote products derived
21 * from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 *
36 */
37
38#pragma once
39
40#include <pcl/Vertices.h>
41#include <pcl/filters/filter_indices.h>
42
43namespace pcl
44{
45 /** \brief Filter points that lie inside or outside a 3D closed surface or 2D
46 * closed polygon, as generated by the ConvexHull or ConcaveHull classes.
47 * \author James Crosby
48 * \ingroup filters
49 */
50 template<typename PointT>
51 class CropHull: public FilterIndices<PointT>
52 {
57
58 using PointCloud = typename Filter<PointT>::PointCloud;
59 using PointCloudPtr = typename PointCloud::Ptr;
60 using PointCloudConstPtr = typename PointCloud::ConstPtr;
61
62 public:
63
64 using Ptr = shared_ptr<CropHull<PointT> >;
65 using ConstPtr = shared_ptr<const CropHull<PointT> >;
66
67 /** \brief Empty Constructor. */
69 hull_cloud_()
70 {
71 filter_name_ = "CropHull";
72 }
73
74 /** \brief Set the vertices of the hull used to filter points.
75 * \param[in] polygons Vector of polygons (Vertices structures) forming
76 * the hull used for filtering points.
77 */
78 inline void
79 setHullIndices (const std::vector<Vertices>& polygons)
80 {
81 hull_polygons_ = polygons;
82 }
83
84 /** \brief Get the vertices of the hull used to filter points.
85 */
86 std::vector<Vertices>
88 {
89 return (hull_polygons_);
90 }
91
92 /** \brief Set the point cloud that the hull indices refer to
93 * \param[in] points the point cloud that the hull indices refer to
94 */
95 inline void
96 setHullCloud (PointCloudPtr points)
97 {
98 hull_cloud_ = points;
99 }
100
101 /** \brief Get the point cloud that the hull indices refer to. */
102 PointCloudPtr
104 {
105 return (hull_cloud_);
106 }
107
108 /** \brief Set the dimensionality of the hull to be used.
109 * This should be set to correspond to the dimensionality of the
110 * convex/concave hull produced by the pcl::ConvexHull and
111 * pcl::ConcaveHull classes.
112 * \param[in] dim Dimensionality of the hull used to filter points.
113 */
114 inline void
115 setDim (int dim)
116 {
117 dim_ = dim;
118 }
119
120 /** \brief Remove points outside the hull (default), or those inside the hull.
121 * \param[in] crop_outside If true, the filter will remove points
122 * outside the hull. If false, those inside will be removed.
123 */
124 inline void
125 setCropOutside(bool crop_outside)
126 {
127 crop_outside_ = crop_outside;
128 }
129
130 protected:
131
132 /** \brief Filter the input points using the 2D or 3D polygon hull.
133 * \param[out] indices the indices of the set of points that passed the filter.
134 */
135 void
136 applyFilter (Indices &indices) override;
137
138 private:
139 /** \brief Return the size of the hull point cloud in line with coordinate axes.
140 * This is used to choose the 2D projection to use when cropping to a 2d
141 * polygon.
142 */
143 Eigen::Vector3f
144 getHullCloudRange ();
145
146 /** \brief Apply the two-dimensional hull filter.
147 * All points are assumed to lie in the same plane as the 2D hull, an
148 * axis-aligned 2D coordinate system using the two dimensions specified
149 * (PlaneDim1, PlaneDim2) is used for calculations.
150 * \param[out] indices The indices of the set of points that pass the
151 * 2D polygon filter.
152 */
153 template<unsigned PlaneDim1, unsigned PlaneDim2> void
154 applyFilter2D (Indices &indices);
155
156 /** \brief Apply the three-dimensional hull filter.
157 * Polygon-ray crossings are used for three rays cast from each point
158 * being tested, and a majority vote of the resulting
159 * polygon-crossings is used to decide whether the point lies inside
160 * or outside the hull.
161 * \param[out] indices The indices of the set of points that pass the 3D
162 * polygon hull filter.
163 */
164 void
165 applyFilter3D (Indices &indices);
166
167 /** \brief Test an individual point against a 2D polygon.
168 * PlaneDim1 and PlaneDim2 specify the x/y/z coordinate axes to use.
169 * \param[in] point Point to test against the polygon.
170 * \param[in] verts Vertex indices of polygon.
171 * \param[in] cloud Cloud from which the vertex indices are drawn.
172 */
173 template<unsigned PlaneDim1, unsigned PlaneDim2> inline static bool
174 isPointIn2DPolyWithVertIndices (const PointT& point,
175 const Vertices& verts,
176 const PointCloud& cloud);
177
178 /** \brief Does a ray cast from a point intersect with an arbitrary
179 * triangle in 3D?
180 * See: http://softsurfer.com/Archive/algorithm_0105/algorithm_0105.htm#intersect_RayTriangle()
181 * \param[in] point Point from which the ray is cast.
182 * \param[in] ray Vector in direction of ray.
183 * \param[in] verts Indices of vertices making the polygon.
184 * \param[in] cloud Cloud from which the vertex indices are drawn.
185 */
186 inline static bool
187 rayTriangleIntersect (const PointT& point,
188 const Eigen::Vector3f& ray,
189 const Vertices& verts,
190 const PointCloud& cloud);
191
192
193 /** \brief The vertices of the hull used to filter points. */
194 std::vector<pcl::Vertices> hull_polygons_;
195
196 /** \brief The point cloud that the hull indices refer to. */
197 PointCloudPtr hull_cloud_;
198
199 /** \brief The dimensionality of the hull to be used. */
200 int dim_{3};
201
202 /** \brief If true, the filter will remove points outside the hull. If
203 * false, those inside will be removed.
204 */
205 bool crop_outside_{true};
206 };
207
208} // namespace pcl
209
210#ifdef PCL_NO_PRECOMPILE
211#include <pcl/filters/impl/crop_hull.hpp>
212#endif
Filter points that lie inside or outside a 3D closed surface or 2D closed polygon,...
Definition crop_hull.h:52
void setHullIndices(const std::vector< Vertices > &polygons)
Set the vertices of the hull used to filter points.
Definition crop_hull.h:79
std::vector< Vertices > getHullIndices() const
Get the vertices of the hull used to filter points.
Definition crop_hull.h:87
void setCropOutside(bool crop_outside)
Remove points outside the hull (default), or those inside the hull.
Definition crop_hull.h:125
CropHull()
Empty Constructor.
Definition crop_hull.h:68
void applyFilter(Indices &indices) override
Filter the input points using the 2D or 3D polygon hull.
Definition crop_hull.hpp:46
void setDim(int dim)
Set the dimensionality of the hull to be used.
Definition crop_hull.h:115
shared_ptr< CropHull< PointT > > Ptr
Definition crop_hull.h:64
shared_ptr< const CropHull< PointT > > ConstPtr
Definition crop_hull.h:65
void setHullCloud(PointCloudPtr points)
Set the point cloud that the hull indices refer to.
Definition crop_hull.h:96
PointCloudPtr getHullCloud() const
Get the point cloud that the hull indices refer to.
Definition crop_hull.h:103
Filter represents the base filter class.
Definition filter.h:81
std::string filter_name_
The filter name.
Definition filter.h:158
IndicesPtr removed_indices_
Indices of the points that are removed.
Definition filter.h:155
FilterIndices represents the base class for filters that are about binary point removal.
PointCloudConstPtr input_
The input point cloud dataset.
Definition pcl_base.h:147
IndicesPtr indices_
A pointer to the vector of point indices to use.
Definition pcl_base.h:150
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition types.h:133
A point structure representing Euclidean xyz coordinates, and the RGB color.
Describes a set of vertices in a polygon mesh, by basically storing an array of indices.
Definition Vertices.h:15