Point Cloud Library (PCL)
1.7.0
|
00001 /* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Point Cloud Library (PCL) - www.pointclouds.org 00005 * Copyright (c) 2010-2011, Willow Garage, Inc. 00006 * Copyright (c) 2012-, Open Perception, Inc. 00007 * 00008 * All rights reserved. 00009 * 00010 * Redistribution and use in source and binary forms, with or without 00011 * modification, are permitted provided that the following conditions 00012 * are met: 00013 * 00014 * * Redistributions of source code must retain the above copyright 00015 * notice, this list of conditions and the following disclaimer. 00016 * * Redistributions in binary form must reproduce the above 00017 * copyright notice, this list of conditions and the following 00018 * disclaimer in the documentation and/or other materials provided 00019 * with the distribution. 00020 * * Neither the name of the copyright holder(s) nor the names of its 00021 * contributors may be used to endorse or promote products derived 00022 * from this software without specific prior written permission. 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00025 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00026 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00027 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00028 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00029 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00030 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00031 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00032 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00033 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00034 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00035 * POSSIBILITY OF SUCH DAMAGE. 00036 * 00037 */ 00038 00039 #ifndef PCL_FEATURES_LINEAR_LEAST_SQUARES_NORMAL_H_ 00040 #define PCL_FEATURES_LINEAR_LEAST_SQUARES_NORMAL_H_ 00041 00042 #include <pcl/point_cloud.h> 00043 #include <pcl/point_types.h> 00044 #include <pcl/features/feature.h> 00045 00046 namespace pcl 00047 { 00048 /** \brief Surface normal estimation on dense data using a least-squares estimation based on a first-order Taylor approximation. 00049 * \author Stefan Holzer, Cedric Cagniart 00050 */ 00051 template <typename PointInT, typename PointOutT> 00052 class LinearLeastSquaresNormalEstimation : public Feature<PointInT, PointOutT> 00053 { 00054 public: 00055 typedef boost::shared_ptr<LinearLeastSquaresNormalEstimation<PointInT, PointOutT> > Ptr; 00056 typedef boost::shared_ptr<const LinearLeastSquaresNormalEstimation<PointInT, PointOutT> > ConstPtr; 00057 typedef typename Feature<PointInT, PointOutT>::PointCloudIn PointCloudIn; 00058 typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut; 00059 using Feature<PointInT, PointOutT>::input_; 00060 using Feature<PointInT, PointOutT>::feature_name_; 00061 using Feature<PointInT, PointOutT>::tree_; 00062 using Feature<PointInT, PointOutT>::k_; 00063 00064 /** \brief Constructor */ 00065 LinearLeastSquaresNormalEstimation () : 00066 use_depth_dependent_smoothing_(false), 00067 max_depth_change_factor_(1.0f), 00068 normal_smoothing_size_(9.0f) 00069 { 00070 feature_name_ = "LinearLeastSquaresNormalEstimation"; 00071 tree_.reset (); 00072 k_ = 1; 00073 }; 00074 00075 /** \brief Destructor */ 00076 virtual ~LinearLeastSquaresNormalEstimation (); 00077 00078 /** \brief Computes the normal at the specified position. 00079 * \param[in] pos_x x position (pixel) 00080 * \param[in] pos_y y position (pixel) 00081 * \param[out] normal the output estimated normal 00082 */ 00083 void 00084 computePointNormal (const int pos_x, const int pos_y, PointOutT &normal); 00085 00086 /** \brief Set the normal smoothing size 00087 * \param[in] normal_smoothing_size factor which influences the size of the area used to smooth normals 00088 * (depth dependent if useDepthDependentSmoothing is true) 00089 */ 00090 void 00091 setNormalSmoothingSize (float normal_smoothing_size) 00092 { 00093 normal_smoothing_size_ = normal_smoothing_size; 00094 } 00095 00096 /** \brief Set whether to use depth depending smoothing or not 00097 * \param[in] use_depth_dependent_smoothing decides whether the smoothing is depth dependent 00098 */ 00099 void 00100 setDepthDependentSmoothing (bool use_depth_dependent_smoothing) 00101 { 00102 use_depth_dependent_smoothing_ = use_depth_dependent_smoothing; 00103 } 00104 00105 /** \brief The depth change threshold for computing object borders 00106 * \param[in] max_depth_change_factor the depth change threshold for computing object borders based on 00107 * depth changes 00108 */ 00109 void 00110 setMaxDepthChangeFactor (float max_depth_change_factor) 00111 { 00112 max_depth_change_factor_ = max_depth_change_factor; 00113 } 00114 00115 /** \brief Provide a pointer to the input dataset (overwrites the PCLBase::setInputCloud method) 00116 * \param[in] cloud the const boost shared pointer to a PointCloud message 00117 */ 00118 virtual inline void 00119 setInputCloud (const typename PointCloudIn::ConstPtr &cloud) 00120 { 00121 input_ = cloud; 00122 } 00123 00124 protected: 00125 /** \brief Computes the normal for the complete cloud. 00126 * \param[out] output the resultant normals 00127 */ 00128 void 00129 computeFeature (PointCloudOut &output); 00130 00131 private: 00132 00133 /** the threshold used to detect depth discontinuities */ 00134 //float distance_threshold_; 00135 00136 /** \brief Smooth data based on depth (true/false). */ 00137 bool use_depth_dependent_smoothing_; 00138 00139 /** \brief Threshold for detecting depth discontinuities */ 00140 float max_depth_change_factor_; 00141 00142 /** \brief */ 00143 float normal_smoothing_size_; 00144 }; 00145 } 00146 00147 #ifdef PCL_NO_PRECOMPILE 00148 #include <pcl/features/impl/linear_least_squares_normal.hpp> 00149 #endif 00150 00151 #endif 00152