Point Cloud Library (PCL)
1.7.1
Main Page
Modules
Namespaces
Classes
segmentation
include
pcl
segmentation
organized_connected_component_segmentation.h
1
/*
2
* Software License Agreement (BSD License)
3
*
4
* Point Cloud Library (PCL) - www.pointclouds.org
5
* Copyright (c) 2010-2012, 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
*/
39
40
#ifndef PCL_SEGMENTATION_ORGANIZED_CONNECTED_COMPONENT_SEGMENTATION_H_
41
#define PCL_SEGMENTATION_ORGANIZED_CONNECTED_COMPONENT_SEGMENTATION_H_
42
43
#include <pcl/pcl_base.h>
44
#include <pcl/PointIndices.h>
45
#include <pcl/segmentation/comparator.h>
46
47
namespace
pcl
48
{
49
/** \brief OrganizedConnectedComponentSegmentation allows connected
50
* components to be found within organized point cloud data, given a
51
* comparison function. Given an input cloud and a comparator, it will
52
* output a PointCloud of labels, giving each connected component a unique
53
* id, along with a vector of PointIndices corresponding to each component.
54
* See OrganizedMultiPlaneSegmentation for an example application.
55
*
56
* \author Alex Trevor, Suat Gedikli
57
*/
58
template
<
typename
Po
int
T,
typename
Po
int
LT>
59
class
OrganizedConnectedComponentSegmentation
:
public
PCLBase
<PointT>
60
{
61
using
PCLBase<PointT>::input_
;
62
using
PCLBase<PointT>::indices_
;
63
using
PCLBase<PointT>::initCompute
;
64
using
PCLBase<PointT>::deinitCompute
;
65
66
public
:
67
typedef
typename
pcl::PointCloud<PointT>
PointCloud
;
68
typedef
typename
PointCloud::Ptr
PointCloudPtr
;
69
typedef
typename
PointCloud::ConstPtr
PointCloudConstPtr
;
70
71
typedef
typename
pcl::PointCloud<PointLT>
PointCloudL
;
72
typedef
typename
PointCloudL::Ptr
PointCloudLPtr
;
73
typedef
typename
PointCloudL::ConstPtr
PointCloudLConstPtr
;
74
75
typedef
typename
pcl::Comparator<PointT>
Comparator
;
76
typedef
typename
Comparator::Ptr
ComparatorPtr
;
77
typedef
typename
Comparator::ConstPtr
ComparatorConstPtr
;
78
79
/** \brief Constructor for OrganizedConnectedComponentSegmentation
80
* \param[in] compare A pointer to the comparator to be used for segmentation. Must be an instance of pcl::Comparator.
81
*/
82
OrganizedConnectedComponentSegmentation
(
const
ComparatorConstPtr
& compare)
83
:
compare_
(compare)
84
{
85
}
86
87
/** \brief Destructor for OrganizedConnectedComponentSegmentation. */
88
virtual
89
~OrganizedConnectedComponentSegmentation
()
90
{
91
}
92
93
/** \brief Provide a pointer to the comparator to be used for segmentation.
94
* \param[in] compare the comparator
95
*/
96
void
97
setComparator
(
const
ComparatorConstPtr
& compare)
98
{
99
compare_
= compare;
100
}
101
102
/** \brief Get the comparator.*/
103
ComparatorConstPtr
104
getComparator
()
const
{
return
(
compare_
); }
105
106
/** \brief Perform the connected component segmentation.
107
* \param[out] labels a PointCloud of labels: each connected component will have a unique id.
108
* \param[out] label_indices a vector of PointIndices corresponding to each label / component id.
109
*/
110
void
111
segment
(
pcl::PointCloud<PointLT>
& labels, std::vector<pcl::PointIndices>& label_indices)
const
;
112
113
/** \brief Find the boundary points / contour of a connected component
114
* \param[in] start_idx the first (lowest) index of the connected component for which a boundary shoudl be returned
115
* \param[in] labels the Label cloud produced by segmentation
116
* \param[out] boundary_indices the indices of the boundary points for the label corresponding to start_idx
117
*/
118
static
void
119
findLabeledRegionBoundary
(
int
start_idx,
PointCloudLPtr
labels,
pcl::PointIndices
& boundary_indices);
120
121
122
protected
:
123
ComparatorConstPtr
compare_
;
124
125
inline
unsigned
126
findRoot
(
const
std::vector<unsigned>& runs,
unsigned
index)
const
127
{
128
register
unsigned
idx = index;
129
while
(runs[idx] != idx)
130
idx = runs[idx];
131
132
return
(idx);
133
}
134
135
private
:
136
struct
Neighbor
137
{
138
Neighbor (
int
dx,
int
dy,
int
didx)
139
: d_x (dx)
140
, d_y (dy)
141
, d_index (didx)
142
{}
143
144
int
d_x;
145
int
d_y;
146
int
d_index;
// = dy * width + dx: pre-calculated
147
};
148
};
149
}
150
151
#ifdef PCL_NO_PRECOMPILE
152
#include <pcl/segmentation/impl/organized_connected_component_segmentation.hpp>
153
#endif
154
155
#endif //#ifndef PCL_ORGANIZED_CONNECTED_COMPONENT_SEGMENTATION_H_