Point Cloud Library (PCL)
1.15.1
Toggle main menu visibility
Loading...
Searching...
No Matches
pcl
surface
bilateral_upsampling.h
1
/*
2
* Software License Agreement (BSD License)
3
*
4
* Point Cloud Library (PCL) - www.pointclouds.org
5
* Copyright (c) 2009-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 Willow Garage, Inc. 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
* $Id$
37
*
38
*/
39
40
#pragma once
41
42
#include <
pcl/memory.h
>
43
#include <
pcl/pcl_macros.h
>
44
#include <pcl/surface/processing.h>
45
46
namespace
pcl
47
{
48
49
/** \brief Bilateral filtering implementation, based on the following paper:
50
* * Kopf, Johannes and Cohen, Michael F. and Lischinski, Dani and Uyttendaele, Matt - Joint Bilateral Upsampling,
51
* * ACM Transactions in Graphics, July 2007
52
*
53
* Takes in a colored organized point cloud (i.e. PointXYZRGB or PointXYZRGBA), that might contain nan values for the
54
* depth information, and it will return an upsampled version of this cloud, based on the formula:
55
* \f[
56
* \tilde{S}_p = \frac{1}{k_p} \sum_{q_d \in \Omega} {S_{q_d} f(||p_d - q_d|| g(||\tilde{I}_p-\tilde{I}_q||})
57
* \f]
58
*
59
* where S is the depth image, I is the RGB image and f and g are Gaussian functions centered at 0 and with
60
* standard deviations \f$\sigma_{color}\f$ and \f$\sigma_{depth}\f$
61
*/
62
template
<
typename
Po
int
InT,
typename
Po
int
OutT>
63
class
BilateralUpsampling
:
public
CloudSurfaceProcessing
<PointInT, PointOutT>
64
{
65
public
:
66
using
Ptr
= shared_ptr<BilateralUpsampling<PointInT, PointOutT> >;
67
using
ConstPtr
= shared_ptr<const BilateralUpsampling<PointInT, PointOutT> >;
68
69
using
PCLBase
<PointInT>
::input_
;
70
using
PCLBase
<PointInT>
::indices_
;
71
using
PCLBase
<PointInT>
::initCompute
;
72
using
PCLBase
<PointInT>
::deinitCompute
;
73
using
CloudSurfaceProcessing
<PointInT, PointOutT>
::process
;
74
75
using
PointCloudOut
=
pcl::PointCloud<PointOutT>
;
76
77
Eigen::Matrix3f
KinectVGAProjectionMatrix
,
KinectSXGAProjectionMatrix
;
78
79
/** \brief Constructor. */
80
BilateralUpsampling
()
81
{
82
KinectVGAProjectionMatrix
<< 525.0f, 0.0f, 320.0f,
83
0.0f, 525.0f, 240.0f,
84
0.0f, 0.0f, 1.0f;
85
KinectSXGAProjectionMatrix
<< 1050.0f, 0.0f, 640.0f,
86
0.0f, 1050.0f, 480.0f,
87
0.0f, 0.0f, 1.0f;
88
};
89
90
/** \brief Method that sets the window size for the filter
91
* \param[in] window_size the given window size
92
*/
93
inline
void
94
setWindowSize
(
int
window_size) { window_size_ = window_size; }
95
96
/** \brief Returns the filter window size */
97
inline
int
98
getWindowSize
()
const
{
return
(window_size_); }
99
100
/** \brief Method that sets the sigma color parameter
101
* \param[in] sigma_color the new value to be set
102
*/
103
inline
void
104
setSigmaColor
(
const
float
&sigma_color) { sigma_color_ = sigma_color; }
105
106
/** \brief Returns the current sigma color value */
107
inline
float
108
getSigmaColor
()
const
{
return
(sigma_color_); }
109
110
/** \brief Method that sets the sigma depth parameter
111
* \param[in] sigma_depth the new value to be set
112
*/
113
inline
void
114
setSigmaDepth
(
const
float
&sigma_depth) { sigma_depth_ = sigma_depth; }
115
116
/** \brief Returns the current sigma depth value */
117
inline
float
118
getSigmaDepth
()
const
{
return
(sigma_depth_); }
119
120
/** \brief Method that sets the projection matrix to be used when unprojecting the points in the depth image
121
* back to (x,y,z) positions.
122
* \note There are 2 matrices already set in the class, used for the 2 modes available for the Kinect. They
123
* are tuned to be the same as the ones in the OpenNiGrabber
124
* \param[in] projection_matrix the new projection matrix to be set */
125
inline
void
126
setProjectionMatrix
(
const
Eigen::Matrix3f &projection_matrix) { projection_matrix_ = projection_matrix; }
127
128
/** \brief Returns the current projection matrix */
129
inline
Eigen::Matrix3f
130
getProjectionMatrix
()
const
{
return
(projection_matrix_); }
131
132
/** \brief Method that does the actual processing on the input cloud.
133
* \param[out] output the container of the resulting upsampled cloud */
134
void
135
process
(
pcl::PointCloud<PointOutT>
&output)
override
;
136
137
protected
:
138
void
139
performProcessing
(
pcl::PointCloud<PointOutT>
&output)
override
;
140
141
/** \brief Computes the distance for depth and RGB.
142
* \param[out] val_exp_depth distance values for depth
143
* \param[out] val_exp_rgb distance values for RGB */
144
void
145
computeDistances
(Eigen::MatrixXf &val_exp_depth, Eigen::VectorXf &val_exp_rgb);
146
147
private
:
148
int
window_size_{5};
149
float
sigma_color_{15.0f}, sigma_depth_{0.5f};
150
Eigen::Matrix3f projection_matrix_, unprojection_matrix_;
151
152
public
:
153
PCL_MAKE_ALIGNED_OPERATOR_NEW
154
};
155
}
156
#ifdef PCL_NO_PRECOMPILE
157
#include <pcl/surface/impl/bilateral_upsampling.hpp>
158
#endif
pcl::BilateralUpsampling::Ptr
shared_ptr< BilateralUpsampling< PointInT, PointOutT > > Ptr
Definition
bilateral_upsampling.h:66
pcl::BilateralUpsampling::getSigmaDepth
float getSigmaDepth() const
Returns the current sigma depth value.
Definition
bilateral_upsampling.h:118
pcl::BilateralUpsampling::KinectSXGAProjectionMatrix
Eigen::Matrix3f KinectSXGAProjectionMatrix
Definition
bilateral_upsampling.h:77
pcl::BilateralUpsampling::computeDistances
void computeDistances(Eigen::MatrixXf &val_exp_depth, Eigen::VectorXf &val_exp_rgb)
Computes the distance for depth and RGB.
Definition
bilateral_upsampling.hpp:156
pcl::BilateralUpsampling::setProjectionMatrix
void setProjectionMatrix(const Eigen::Matrix3f &projection_matrix)
Method that sets the projection matrix to be used when unprojecting the points in the depth image bac...
Definition
bilateral_upsampling.h:126
pcl::BilateralUpsampling::getProjectionMatrix
Eigen::Matrix3f getProjectionMatrix() const
Returns the current projection matrix.
Definition
bilateral_upsampling.h:130
pcl::BilateralUpsampling::ConstPtr
shared_ptr< const BilateralUpsampling< PointInT, PointOutT > > ConstPtr
Definition
bilateral_upsampling.h:67
pcl::BilateralUpsampling::BilateralUpsampling
BilateralUpsampling()
Constructor.
Definition
bilateral_upsampling.h:80
pcl::BilateralUpsampling::process
void process(pcl::PointCloud< PointOutT > &output) override
Method that does the actual processing on the input cloud.
Definition
bilateral_upsampling.hpp:50
pcl::BilateralUpsampling::getSigmaColor
float getSigmaColor() const
Returns the current sigma color value.
Definition
bilateral_upsampling.h:108
pcl::BilateralUpsampling::KinectVGAProjectionMatrix
Eigen::Matrix3f KinectVGAProjectionMatrix
Definition
bilateral_upsampling.h:77
pcl::BilateralUpsampling::PointCloudOut
pcl::PointCloud< PointOutT > PointCloudOut
Definition
bilateral_upsampling.h:75
pcl::BilateralUpsampling::performProcessing
void performProcessing(pcl::PointCloud< PointOutT > &output) override
Abstract cloud processing method.
Definition
bilateral_upsampling.hpp:88
pcl::BilateralUpsampling::setSigmaDepth
void setSigmaDepth(const float &sigma_depth)
Method that sets the sigma depth parameter.
Definition
bilateral_upsampling.h:114
pcl::BilateralUpsampling::setWindowSize
void setWindowSize(int window_size)
Method that sets the window size for the filter.
Definition
bilateral_upsampling.h:94
pcl::BilateralUpsampling::setSigmaColor
void setSigmaColor(const float &sigma_color)
Method that sets the sigma color parameter.
Definition
bilateral_upsampling.h:104
pcl::BilateralUpsampling::getWindowSize
int getWindowSize() const
Returns the filter window size.
Definition
bilateral_upsampling.h:98
pcl::CloudSurfaceProcessing::CloudSurfaceProcessing
CloudSurfaceProcessing()
Constructor.
Definition
processing.h:70
pcl::PCLBase
PCL base class.
Definition
pcl_base.h:70
pcl::PCLBase< PointInT >::input_
PointCloudConstPtr input_
Definition
pcl_base.h:147
pcl::PCLBase< PointInT >::indices_
IndicesPtr indices_
Definition
pcl_base.h:150
pcl::PCLBase< PointInT >::initCompute
bool initCompute()
pcl::PCLBase< PointInT >::deinitCompute
bool deinitCompute()
pcl::PointCloud
PointCloud represents the base class in PCL for storing collections of 3D points.
Definition
point_cloud.h:174
PCL_MAKE_ALIGNED_OPERATOR_NEW
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
Definition
memory.h:86
memory.h
Defines functions, macros and traits for allocating and using memory.
pcl
Definition
convolution.h:46
pcl_macros.h
Defines all the PCL and non-PCL macros used.