|
Point Cloud Library (PCL)
1.5.1
|
00001 /* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright (c) 2009, Willow Garage, Inc. 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 00011 * * Redistributions of source code must retain the above copyright 00012 * notice, this list of conditions and the following disclaimer. 00013 * * Redistributions in binary form must reproduce the above 00014 * copyright notice, this list of conditions and the following 00015 * disclaimer in the documentation and/or other materials provided 00016 * with the distribution. 00017 * * Neither the name of Willow Garage, Inc. nor the names of its 00018 * contributors may be used to endorse or promote products derived 00019 * from this software without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00024 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00025 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00026 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00027 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00031 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 * 00034 * $Id: rsd.h 4702 2012-02-23 09:39:33Z gedikli $ 00035 * 00036 */ 00037 00038 #ifndef PCL_RSD_H_ 00039 #define PCL_RSD_H_ 00040 00041 #include <pcl/features/feature.h> 00042 00043 namespace pcl 00044 { 00054 inline int 00055 getSimpleType (float min_radius, float max_radius, 00056 double min_radius_plane = 0.100, 00057 double max_radius_noise = 0.015, 00058 double min_radius_cylinder = 0.175, 00059 double max_min_radius_diff = 0.050) 00060 { 00061 if (min_radius > min_radius_plane) 00062 return 1; // plane 00063 else if (max_radius > min_radius_cylinder) 00064 return 2; // cylinder (rim) 00065 else if (min_radius < max_radius_noise) 00066 return 0; // noise/corner 00067 else if (max_radius - min_radius < max_min_radius_diff) 00068 return 3; // sphere/corner 00069 else 00070 return 4; // edge 00071 } 00072 00080 template <int N> void 00081 getFeaturePointCloud (const std::vector<Eigen::MatrixXf> &histograms2D, PointCloud<Histogram<N> > &histogramsPC) 00082 { 00083 histogramsPC.points.resize (histograms2D.size ()); 00084 histogramsPC.width = histograms2D.size (); 00085 histogramsPC.height = 1; 00086 histogramsPC.is_dense = true; 00087 00088 const int rows = histograms2D.at(0).rows(); 00089 const int cols = histograms2D.at(0).cols(); 00090 00091 typename PointCloud<Histogram<N> >::VectorType::iterator it = histogramsPC.points.begin (); 00092 BOOST_FOREACH (Eigen::MatrixXf h, histograms2D) 00093 { 00094 Eigen::Map<Eigen::MatrixXf> histogram (&(it->histogram[0]), rows, cols); 00095 histogram = h; 00096 ++it; 00097 } 00098 } 00099 00111 template <typename PointInT, typename PointNT, typename PointOutT> Eigen::MatrixXf 00112 computeRSD (boost::shared_ptr<const pcl::PointCloud<PointInT> > &surface, boost::shared_ptr<const pcl::PointCloud<PointNT> > &normals, 00113 const std::vector<int> &indices, double max_dist, 00114 int nr_subdiv, double plane_radius, PointOutT &radii, bool compute_histogram = false); 00115 00127 template <typename PointNT, typename PointOutT> Eigen::MatrixXf 00128 computeRSD (boost::shared_ptr<const pcl::PointCloud<PointNT> > &normals, 00129 const std::vector<int> &indices, const std::vector<float> &sqr_dists, double max_dist, 00130 int nr_subdiv, double plane_radius, PointOutT &radii, bool compute_histogram = false); 00131 00154 template <typename PointInT, typename PointNT, typename PointOutT> 00155 class RSDEstimation : public FeatureFromNormals<PointInT, PointNT, PointOutT> 00156 { 00157 public: 00158 using Feature<PointInT, PointOutT>::feature_name_; 00159 using Feature<PointInT, PointOutT>::getClassName; 00160 using Feature<PointInT, PointOutT>::indices_; 00161 using Feature<PointInT, PointOutT>::search_radius_; 00162 using Feature<PointInT, PointOutT>::search_parameter_; 00163 using Feature<PointInT, PointOutT>::surface_; 00164 using FeatureFromNormals<PointInT, PointNT, PointOutT>::normals_; 00165 00166 typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut; 00167 typedef typename Feature<PointInT, PointOutT>::PointCloudIn PointCloudIn; 00168 00170 RSDEstimation () : nr_subdiv_ (5), plane_radius_ (0.2), save_histograms_ (false) 00171 { 00172 feature_name_ = "RadiusSurfaceDescriptor"; 00173 }; 00174 00178 inline void 00179 setNrSubdivisions (int nr_subdiv) { nr_subdiv_ = nr_subdiv; } 00180 00182 inline int 00183 getNrSubdivisions () { return (nr_subdiv_); } 00184 00190 inline void 00191 setPlaneRadius (double plane_radius) { plane_radius_ = plane_radius; } 00192 00194 inline double 00195 getPlaneRadius () { return (plane_radius_); } 00196 00198 inline void 00199 setKSearch (int) 00200 { 00201 PCL_ERROR ("[pcl::%s::setKSearch] RSD does not work with k nearest neighbor search. Use setRadiusSearch() instead!\n", getClassName ().c_str ()); 00202 } 00203 00208 inline void 00209 setSaveHistograms (bool save) { save_histograms_ = save; } 00210 00212 inline bool 00213 getSaveHistograms () { return save_histograms_; } 00214 00216 inline boost::shared_ptr<std::vector<Eigen::MatrixXf> > 00217 getHistograms () { return histograms_; } 00218 00219 protected: 00220 00226 void 00227 computeFeature (PointCloudOut &output); 00228 00230 boost::shared_ptr<std::vector<Eigen::MatrixXf> > histograms_; 00231 00232 private: 00234 // TODO double max_dist_; 00235 00237 int nr_subdiv_; 00238 00240 double plane_radius_; 00241 00243 bool save_histograms_; 00244 00248 void 00249 computeFeatureEigen (pcl::PointCloud<Eigen::MatrixXf> &output) {} 00250 }; 00251 } 00252 00253 #endif //#ifndef PCL_RSD_H_ 00254 00255
1.8.0