Point Cloud Library (PCL)
1.15.1
Toggle main menu visibility
Loading...
Searching...
No Matches
pcl
filters
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
43
namespace
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
Po
int
T>
51
class
CropHull
:
public
FilterIndices
<PointT>
52
{
53
using
Filter
<PointT>
::filter_name_
;
54
using
Filter
<PointT>
::indices_
;
55
using
Filter
<PointT>
::input_
;
56
using
Filter
<PointT>
::removed_indices_
;
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. */
68
CropHull
() :
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>
87
getHullIndices
()
const
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
103
getHullCloud
()
const
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
pcl::CropHull::setHullIndices
void setHullIndices(const std::vector< Vertices > &polygons)
Set the vertices of the hull used to filter points.
Definition
crop_hull.h:79
pcl::CropHull::getHullIndices
std::vector< Vertices > getHullIndices() const
Get the vertices of the hull used to filter points.
Definition
crop_hull.h:87
pcl::CropHull::setCropOutside
void setCropOutside(bool crop_outside)
Remove points outside the hull (default), or those inside the hull.
Definition
crop_hull.h:125
pcl::CropHull::CropHull
CropHull()
Empty Constructor.
Definition
crop_hull.h:68
pcl::CropHull::applyFilter
void applyFilter(Indices &indices) override
Filter the input points using the 2D or 3D polygon hull.
Definition
crop_hull.hpp:46
pcl::CropHull::setDim
void setDim(int dim)
Set the dimensionality of the hull to be used.
Definition
crop_hull.h:115
pcl::CropHull::Ptr
shared_ptr< CropHull< PointT > > Ptr
Definition
crop_hull.h:64
pcl::CropHull::ConstPtr
shared_ptr< const CropHull< PointT > > ConstPtr
Definition
crop_hull.h:65
pcl::CropHull::setHullCloud
void setHullCloud(PointCloudPtr points)
Set the point cloud that the hull indices refer to.
Definition
crop_hull.h:96
pcl::CropHull::getHullCloud
PointCloudPtr getHullCloud() const
Get the point cloud that the hull indices refer to.
Definition
crop_hull.h:103
pcl::Filter
Filter represents the base filter class.
Definition
filter.h:81
pcl::Filter::PointCloud
pcl::PointCloud< PointT > PointCloud
Definition
filter.h:87
pcl::Filter::filter_name_
std::string filter_name_
The filter name.
Definition
filter.h:158
pcl::Filter::removed_indices_
IndicesPtr removed_indices_
Indices of the points that are removed.
Definition
filter.h:155
pcl::FilterIndices::FilterIndices
FilterIndices(bool extract_removed_indices=false)
Constructor.
Definition
filter_indices.h:87
pcl::PCLBase::input_
PointCloudConstPtr input_
The input point cloud dataset.
Definition
pcl_base.h:147
pcl::PCLBase::indices_
IndicesPtr indices_
A pointer to the vector of point indices to use.
Definition
pcl_base.h:150
pcl::PointCloud
PointCloud represents the base class in PCL for storing collections of 3D points.
Definition
point_cloud.h:174
pcl::PointCloud::Ptr
shared_ptr< PointCloud< PointT > > Ptr
Definition
point_cloud.h:414
pcl::PointCloud::ConstPtr
shared_ptr< const PointCloud< PointT > > ConstPtr
Definition
point_cloud.h:415
pcl
Definition
convolution.h:46
pcl::Indices
IndicesAllocator<> Indices
Type used for indices in PCL.
Definition
types.h:133
pcl::Vertices
Describes a set of vertices in a polygon mesh, by basically storing an array of indices.
Definition
Vertices.h:15