feature.h
Go to the documentation of this file.
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  *
00007  *  All rights reserved.
00008  *
00009  *  Redistribution and use in source and binary forms, with or without
00010  *  modification, are permitted provided that the following conditions
00011  *  are met:
00012  *
00013  *   * Redistributions of source code must retain the above copyright
00014  *     notice, this list of conditions and the following disclaimer.
00015  *   * Redistributions in binary form must reproduce the above
00016  *     copyright notice, this list of conditions and the following
00017  *     disclaimer in the documentation and/or other materials provided
00018  *     with the distribution.
00019  *   * Neither the name of Willow Garage, Inc. nor the names of its
00020  *     contributors may be used to endorse or promote products derived
00021  *     from this software without specific prior written permission.
00022  *
00023  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00024  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00025  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00026  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00027  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00028  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00029  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00030  *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00031  *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00032  *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00033  *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00034  *  POSSIBILITY OF SUCH DAMAGE.
00035  *
00036  * $Id: feature.h 6453 2012-07-17 23:09:54Z svn $
00037  *
00038  */
00039 
00040 #ifndef PCL_FEATURE_H_
00041 #define PCL_FEATURE_H_
00042 
00043 #include <boost/function.hpp>
00044 #include <boost/bind.hpp>
00045 #include <boost/mpl/size.hpp>
00046 
00047 // PCL includes
00048 #include <pcl/pcl_base.h>
00049 #include <pcl/common/eigen.h>
00050 #include <pcl/common/centroid.h>
00051 #include <pcl/search/search.h>
00052 
00053 namespace pcl
00054 {
00066   inline void
00067   solvePlaneParameters (const Eigen::Matrix3f &covariance_matrix,
00068                         const Eigen::Vector4f &point,
00069                         Eigen::Vector4f &plane_parameters, float &curvature);
00070 
00083   inline void
00084   solvePlaneParameters (const Eigen::Matrix3f &covariance_matrix,
00085                         float &nx, float &ny, float &nz, float &curvature);
00086 
00090 
00103   template <typename PointInT, typename PointOutT>
00104   class Feature : public PCLBase<PointInT>
00105   {
00106     public:
00107       using PCLBase<PointInT>::indices_;
00108       using PCLBase<PointInT>::input_;
00109 
00110       typedef PCLBase<PointInT> BaseClass;
00111 
00112       typedef boost::shared_ptr< Feature<PointInT, PointOutT> > Ptr;
00113       typedef boost::shared_ptr< const Feature<PointInT, PointOutT> > ConstPtr;
00114 
00115       typedef typename pcl::search::Search<PointInT> KdTree;
00116       typedef typename pcl::search::Search<PointInT>::Ptr KdTreePtr;
00117 
00118       typedef pcl::PointCloud<PointInT> PointCloudIn;
00119       typedef typename PointCloudIn::Ptr PointCloudInPtr;
00120       typedef typename PointCloudIn::ConstPtr PointCloudInConstPtr;
00121 
00122       typedef pcl::PointCloud<PointOutT> PointCloudOut;
00123 
00124       typedef boost::function<int (size_t, double, std::vector<int> &, std::vector<float> &)> SearchMethod;
00125       typedef boost::function<int (const PointCloudIn &cloud, size_t index, double, std::vector<int> &, std::vector<float> &)> SearchMethodSurface;
00126 
00127     public:
00129       Feature () :
00130         feature_name_ (), search_method_surface_ (),
00131         surface_(), tree_(),
00132         search_parameter_(0), search_radius_(0), k_(0),
00133         fake_surface_(false)
00134       {}
00135 
00143       inline void
00144       setSearchSurface (const PointCloudInConstPtr &cloud)
00145       {
00146         surface_ = cloud;
00147         fake_surface_ = false;
00148         //use_surface_  = true;
00149       }
00150 
00152       inline PointCloudInConstPtr
00153       getSearchSurface () const
00154       {
00155         return (surface_);
00156       }
00157 
00161       inline void
00162       setSearchMethod (const KdTreePtr &tree) { tree_ = tree; }
00163 
00165       inline KdTreePtr
00166       getSearchMethod () const
00167       {
00168         return (tree_);
00169       }
00170 
00172       inline double
00173       getSearchParameter () const
00174       {
00175         return (search_parameter_);
00176       }
00177 
00181       inline void
00182       setKSearch (int k) { k_ = k; }
00183 
00185       inline int
00186       getKSearch () const
00187       {
00188         return (k_);
00189       }
00190 
00195       inline void
00196       setRadiusSearch (double radius)
00197       {
00198         search_radius_ = radius;
00199       }
00200 
00202       inline double
00203       getRadiusSearch () const
00204       {
00205         return (search_radius_);
00206       }
00207 
00213       void
00214       compute (PointCloudOut &output);
00215 
00221       void
00222       computeEigen (pcl::PointCloud<Eigen::MatrixXf> &output);
00223 
00224     protected:
00226       std::string feature_name_;
00227 
00229       SearchMethodSurface search_method_surface_;
00230 
00234       PointCloudInConstPtr surface_;
00235 
00237       KdTreePtr tree_;
00238 
00240       double search_parameter_;
00241 
00243       double search_radius_;
00244 
00246       int k_;
00247 
00249       inline const std::string&
00250       getClassName () const { return (feature_name_); }
00251 
00253       virtual bool
00254       initCompute ();
00255 
00257       virtual bool
00258       deinitCompute ();
00259 
00261       bool fake_surface_;
00262 
00273       inline int
00274       searchForNeighbors (size_t index, double parameter,
00275                           std::vector<int> &indices, std::vector<float> &distances) const
00276       {
00277         return (search_method_surface_ (*input_, index, parameter, indices, distances));
00278       }
00279 
00291       inline int
00292       searchForNeighbors (const PointCloudIn &cloud, size_t index, double parameter,
00293                           std::vector<int> &indices, std::vector<float> &distances) const
00294       {
00295         return (search_method_surface_ (cloud, index, parameter, indices, distances));
00296       }
00297 
00298     private:
00302       virtual void
00303       computeFeature (PointCloudOut &output) = 0;
00304 
00308       virtual void
00309       computeFeatureEigen (pcl::PointCloud<Eigen::MatrixXf> &output) = 0;
00310 
00311     public:
00312       EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00313   };
00314 
00315 
00319   template <typename PointInT, typename PointNT, typename PointOutT>
00320   class FeatureFromNormals : public Feature<PointInT, PointOutT>
00321   {
00322     typedef typename Feature<PointInT, PointOutT>::PointCloudIn PointCloudIn;
00323     typedef typename PointCloudIn::Ptr PointCloudInPtr;
00324     typedef typename PointCloudIn::ConstPtr PointCloudInConstPtr;
00325     typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut;
00326 
00327     public:
00328       typedef typename pcl::PointCloud<PointNT> PointCloudN;
00329       typedef typename PointCloudN::Ptr PointCloudNPtr;
00330       typedef typename PointCloudN::ConstPtr PointCloudNConstPtr;
00331 
00332       typedef boost::shared_ptr< FeatureFromNormals<PointInT, PointNT, PointOutT> > Ptr;
00333       typedef boost::shared_ptr< const FeatureFromNormals<PointInT, PointNT, PointOutT> > ConstPtr;
00334 
00335       // Members derived from the base class
00336       using Feature<PointInT, PointOutT>::input_;
00337       using Feature<PointInT, PointOutT>::surface_;
00338       using Feature<PointInT, PointOutT>::getClassName;
00339 
00341       FeatureFromNormals () : normals_ () {}
00342 
00350       inline void
00351       setInputNormals (const PointCloudNConstPtr &normals) { normals_ = normals; }
00352 
00354       inline PointCloudNConstPtr
00355       getInputNormals () const { return (normals_); }
00356 
00357     protected:
00361       PointCloudNConstPtr normals_;
00362 
00364       virtual bool
00365       initCompute ();
00366 
00367     public:
00368       EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00369   };
00370 
00374   template <typename PointInT, typename PointLT, typename PointOutT>
00375   class FeatureFromLabels : public Feature<PointInT, PointOutT>
00376   {
00377     typedef typename Feature<PointInT, PointOutT>::PointCloudIn PointCloudIn;
00378     typedef typename PointCloudIn::Ptr PointCloudInPtr;
00379     typedef typename PointCloudIn::ConstPtr PointCloudInConstPtr;
00380 
00381     typedef typename pcl::PointCloud<PointLT> PointCloudL;
00382     typedef typename PointCloudL::Ptr PointCloudNPtr;
00383     typedef typename PointCloudL::ConstPtr PointCloudLConstPtr;
00384 
00385     typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut;
00386 
00387     public:
00388       typedef boost::shared_ptr< FeatureFromLabels<PointInT, PointLT, PointOutT> > Ptr;
00389       typedef boost::shared_ptr< const FeatureFromLabels<PointInT, PointLT, PointOutT> > ConstPtr;
00390 
00391       // Members derived from the base class
00392       using Feature<PointInT, PointOutT>::input_;
00393       using Feature<PointInT, PointOutT>::surface_;
00394       using Feature<PointInT, PointOutT>::getClassName;
00395       using Feature<PointInT, PointOutT>::k_;
00396 
00398       FeatureFromLabels () : labels_ ()
00399       {
00400         k_ = 1; // Search tree is not always used here.
00401       }
00402 
00409       inline void
00410       setInputLabels (const PointCloudLConstPtr &labels)
00411       {
00412         labels_ = labels;
00413       }
00414 
00416       inline PointCloudLConstPtr
00417       getInputLabels () const
00418       {
00419         return (labels_);
00420       }
00421 
00422     protected:
00426       PointCloudLConstPtr labels_;
00427 
00429       virtual bool
00430       initCompute ();
00431 
00432     public:
00433       EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00434   };
00435 
00439 
00450   template <typename PointInT, typename PointRFT>
00451   class FeatureWithLocalReferenceFrames
00452   {
00453     public:
00454       typedef pcl::PointCloud<PointRFT> PointCloudLRF;
00455       typedef typename PointCloudLRF::Ptr PointCloudLRFPtr;
00456       typedef typename PointCloudLRF::ConstPtr PointCloudLRFConstPtr;
00457 
00459       FeatureWithLocalReferenceFrames () : frames_ (), frames_never_defined_ (true) {}
00460 
00462       virtual ~FeatureWithLocalReferenceFrames () {}
00463 
00470       inline void
00471       setInputReferenceFrames (const PointCloudLRFConstPtr &frames)
00472       {
00473         frames_ = frames;
00474         frames_never_defined_ = false;
00475       }
00476 
00478       inline PointCloudLRFConstPtr
00479       getInputReferenceFrames () const
00480       {
00481         return (frames_);
00482       }
00483 
00484     protected:
00486       PointCloudLRFConstPtr frames_;
00488       bool frames_never_defined_;
00489 
00495       typedef typename Feature<PointInT, PointRFT>::Ptr LRFEstimationPtr;
00496       virtual bool
00497       initLocalReferenceFrames (const size_t& indices_size,
00498                                 const LRFEstimationPtr& lrf_estimation = LRFEstimationPtr());
00499   };
00500 }
00501 
00502 #include <pcl/features/impl/feature.hpp>
00503 
00504 #endif  //#ifndef PCL_FEATURE_H_


pcl
Author(s): Open Perception
autogenerated on Mon Oct 6 2014 03:15:05