Point Cloud Library (PCL)  1.7.1
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 
41 #ifndef PCL_SURFACE_BILATERAL_UPSAMPLING_H_
42 #define PCL_SURFACE_BILATERAL_UPSAMPLING_H_
43 
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 Transations 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 PointInT, typename PointOutT>
63  class BilateralUpsampling: public CloudSurfaceProcessing<PointInT, PointOutT>
64  {
65  public:
66  typedef boost::shared_ptr<BilateralUpsampling<PointInT, PointOutT> > Ptr;
67  typedef boost::shared_ptr<const BilateralUpsampling<PointInT, PointOutT> > ConstPtr;
68 
74 
76 
78 
79  /** \brief Constructor. */
81  : KinectVGAProjectionMatrix ()
82  , KinectSXGAProjectionMatrix ()
83  , window_size_ (5)
84  , sigma_color_ (15.0f)
85  , sigma_depth_ (0.5f)
86  , projection_matrix_ ()
87  , unprojection_matrix_ ()
88  {
89  KinectVGAProjectionMatrix << 525.0f, 0.0f, 320.0f,
90  0.0f, 525.0f, 240.0f,
91  0.0f, 0.0f, 1.0f;
92  KinectSXGAProjectionMatrix << 1050.0f, 0.0f, 640.0f,
93  0.0f, 1050.0f, 480.0f,
94  0.0f, 0.0f, 1.0f;
95  };
96 
97  /** \brief Method that sets the window size for the filter
98  * \param[in] window_size the given window size
99  */
100  inline void
101  setWindowSize (int window_size) { window_size_ = window_size; }
102 
103  /** \brief Returns the filter window size */
104  inline int
105  getWindowSize () const { return (window_size_); }
106 
107  /** \brief Method that sets the sigma color parameter
108  * \param[in] sigma_color the new value to be set
109  */
110  inline void
111  setSigmaColor (const float &sigma_color) { sigma_color_ = sigma_color; }
112 
113  /** \brief Returns the current sigma color value */
114  inline float
115  getSigmaColor () const { return (sigma_color_); }
116 
117  /** \brief Method that sets the sigma depth parameter
118  * \param[in] sigma_depth the new value to be set
119  */
120  inline void
121  setSigmaDepth (const float &sigma_depth) { sigma_depth_ = sigma_depth; }
122 
123  /** \brief Returns the current sigma depth value */
124  inline float
125  getSigmaDepth () const { return (sigma_depth_); }
126 
127  /** \brief Method that sets the projection matrix to be used when unprojecting the points in the depth image
128  * back to (x,y,z) positions.
129  * \note There are 2 matrices already set in the class, used for the 2 modes available for the Kinect. They
130  * are tuned to be the same as the ones in the OpenNiGrabber
131  * \param[in] projection_matrix the new projection matrix to be set */
132  inline void
133  setProjectionMatrix (const Eigen::Matrix3f &projection_matrix) { projection_matrix_ = projection_matrix; }
134 
135  /** \brief Returns the current projection matrix */
136  inline Eigen::Matrix3f
137  getProjectionMatrix () const { return (projection_matrix_); }
138 
139  /** \brief Method that does the actual processing on the input cloud.
140  * \param[out] output the container of the resulting upsampled cloud */
141  void
143 
144  protected:
145  void
147 
148  private:
149  int window_size_;
150  float sigma_color_, sigma_depth_;
151  Eigen::Matrix3f projection_matrix_, unprojection_matrix_;
152 
153  public:
154  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
155  };
156 }
157 
158 #endif /* PCL_SURFACE_BILATERAL_UPSAMPLING_H_ */
float getSigmaColor() const
Returns the current sigma color value.
Eigen::Matrix3f getProjectionMatrix() const
Returns the current projection matrix.
void performProcessing(pcl::PointCloud< PointOutT > &output)
Abstract cloud processing method.
void process(pcl::PointCloud< PointOutT > &output)
Method that does the actual processing on the input cloud.
pcl::PointCloud< PointOutT > PointCloudOut
Eigen::Matrix3f KinectVGAProjectionMatrix
boost::shared_ptr< BilateralUpsampling< PointInT, PointOutT > > Ptr
void setSigmaColor(const float &sigma_color)
Method that sets the sigma color parameter.
PCL base class.
Definition: pcl_base.h:68
void setSigmaDepth(const float &sigma_depth)
Method that sets the sigma depth parameter.
float getSigmaDepth() const
Returns the current sigma depth value.
CloudSurfaceProcessing represents the base class for algorithms that takes a point cloud as input and...
Definition: processing.h:57
boost::shared_ptr< const BilateralUpsampling< PointInT, PointOutT > > ConstPtr
void setWindowSize(int window_size)
Method that sets the window size for the filter.
int getWindowSize() const
Returns the filter window size.
Bilateral filtering implementation, based on the following paper:
Eigen::Matrix3f KinectSXGAProjectionMatrix
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...
PointCloud represents the base class in PCL for storing collections of 3D points. ...