Point Cloud Library (PCL) 1.15.0
Loading...
Searching...
No Matches
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#pragma once
41
42#include <pcl/pcl_base.h>
43#include <pcl/PointIndices.h>
44#include <pcl/segmentation/comparator.h>
45
46namespace pcl
47{
48 /** \brief OrganizedConnectedComponentSegmentation allows connected
49 * components to be found within organized point cloud data, given a
50 * comparison function. Given an input cloud and a comparator, it will
51 * output a PointCloud of labels, giving each connected component a unique
52 * id, along with a vector of PointIndices corresponding to each component.
53 * See OrganizedMultiPlaneSegmentation for an example application.
54 *
55 * \author Alex Trevor, Suat Gedikli
56 * \ingroup segmentation
57 */
58 template <typename PointT, typename PointLT>
60 {
65
66 public:
70
74
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 */
83 : compare_ (compare)
84 {
85 }
86
87 /** \brief Destructor for OrganizedConnectedComponentSegmentation. */
88
90
91 /** \brief Provide a pointer to the comparator to be used for segmentation.
92 * \param[in] compare the comparator
93 */
94 void
96 {
97 compare_ = compare;
98 }
99
100 /** \brief Get the comparator.*/
102 getComparator () const { return (compare_); }
103
104 /** \brief Perform the connected component segmentation.
105 * \param[out] labels a PointCloud of labels: each connected component will have a unique id.
106 * \param[out] label_indices a vector of PointIndices corresponding to each label / component id.
107 */
108 void
109 segment (pcl::PointCloud<PointLT>& labels, std::vector<pcl::PointIndices>& label_indices) const;
110
111 /** \brief Find the boundary points / contour of a connected component
112 * \param[in] start_idx the first (lowest) index of the connected component for which a boundary should be returned
113 * \param[in] labels the Label cloud produced by segmentation
114 * \param[out] boundary_indices the indices of the boundary points for the label corresponding to start_idx
115 */
116 static void
117 findLabeledRegionBoundary (int start_idx, PointCloudLPtr labels, pcl::PointIndices& boundary_indices);
118
119
120 protected:
122
123 inline unsigned
124 findRoot (const std::vector<unsigned>& runs, unsigned index) const
125 {
126 unsigned idx = index;
127 while (runs[idx] != idx)
128 idx = runs[idx];
129
130 return (idx);
131 }
132
133 private:
134 struct Neighbor
135 {
136 Neighbor (int dx, int dy, int didx)
137 : d_x (dx)
138 , d_y (dy)
139 , d_index (didx)
140 {}
141
142 int d_x;
143 int d_y;
144 int d_index; // = dy * width + dx: pre-calculated
145 };
146 };
147}
148
149#ifdef PCL_NO_PRECOMPILE
150#include <pcl/segmentation/impl/organized_connected_component_segmentation.hpp>
151#endif
Comparator is the base class for comparators that compare two points given some function.
Definition comparator.h:55
shared_ptr< Comparator< PointT > > Ptr
Definition comparator.h:61
shared_ptr< const Comparator< PointT > > ConstPtr
Definition comparator.h:62
OrganizedConnectedComponentSegmentation allows connected components to be found within organized poin...
static void findLabeledRegionBoundary(int start_idx, PointCloudLPtr labels, pcl::PointIndices &boundary_indices)
Find the boundary points / contour of a connected component.
unsigned findRoot(const std::vector< unsigned > &runs, unsigned index) const
void setComparator(const ComparatorConstPtr &compare)
Provide a pointer to the comparator to be used for segmentation.
void segment(pcl::PointCloud< PointLT > &labels, std::vector< pcl::PointIndices > &label_indices) const
Perform the connected component segmentation.
~OrganizedConnectedComponentSegmentation() override=default
Destructor for OrganizedConnectedComponentSegmentation.
OrganizedConnectedComponentSegmentation(const ComparatorConstPtr &compare)
Constructor for OrganizedConnectedComponentSegmentation.
PCL base class.
Definition pcl_base.h:70
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
bool initCompute()
This method should get called before starting the actual computation.
Definition pcl_base.hpp:138
bool deinitCompute()
This method should get called after finishing the actual computation.
Definition pcl_base.hpp:175
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
A point structure representing Euclidean xyz coordinates, and the RGB color.