implicit_shape_model.h
Go to the documentation of this file.
00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2011, 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  */
00035 
00036 #ifndef PCL_IMPLICIT_SHAPE_MODEL_H_
00037 #define PCL_IMPLICIT_SHAPE_MODEL_H_
00038 
00039 #include <vector>
00040 #include <fstream>
00041 #include <limits>
00042 #include <Eigen/src/Core/Matrix.h>
00043 #include <pcl/pcl_base.h>
00044 #include <pcl/point_types.h>
00045 #include <pcl/point_representation.h>
00046 #include <pcl/features/feature.h>
00047 #include <pcl/features/spin_image.h>
00048 #include <pcl/filters/voxel_grid.h>
00049 #include <pcl/filters/extract_indices.h>
00050 #include <pcl/search/search.h>
00051 #include <pcl/kdtree/kdtree.h>
00052 #include <pcl/kdtree/kdtree_flann.h>
00053 #include <pcl/kdtree/impl/kdtree_flann.hpp>
00054 
00055 namespace pcl
00056 {
00058   struct ISMPeak
00059   {
00061     PCL_ADD_POINT4D;
00062 
00064     double density;
00065 
00067     int class_id;
00068 
00069     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00070   } EIGEN_ALIGN16;
00071 
00072   namespace features
00073   {
00076     template <typename PointT>
00077     class PCL_EXPORTS ISMVoteList
00078     {
00079       public:
00080 
00082         ISMVoteList ();
00083 
00085         virtual
00086         ~ISMVoteList ();
00087 
00093         void
00094         addVote (pcl::InterestPoint& in_vote, const PointT &vote_origin, int in_class);
00095 
00099         typename pcl::PointCloud<pcl::PointXYZRGB>::Ptr
00100         getColoredCloud (typename pcl::PointCloud<PointT>::Ptr cloud = 0);
00101 
00108         void
00109         findStrongestPeaks (std::vector<ISMPeak, Eigen::aligned_allocator<ISMPeak> > &out_peaks, int in_class_id, double in_non_maxima_radius, double in_sigma);
00110 
00115         double
00116         getDensityAtPoint (const PointT &point, double sigma_dist);
00117 
00119         unsigned int
00120         getNumberOfVotes ();
00121 
00122       protected:
00123 
00125         void
00126         validateTree ();
00127 
00128         Eigen::Vector3f
00129         shiftMean (const Eigen::Vector3f& snapPt, const double in_dSigmaDist);
00130 
00131       protected:
00132 
00134         pcl::PointCloud<pcl::InterestPoint>::Ptr votes_;
00135 
00137         bool tree_is_valid_;
00138 
00140         typename pcl::PointCloud<PointT>::Ptr votes_origins_;
00141 
00143         std::vector<int> votes_class_;
00144 
00146         pcl::KdTreeFLANN<pcl::InterestPoint>::Ptr tree_;
00147 
00149         std::vector<int> k_ind_;
00150 
00152         std::vector<float> k_sqr_dist_;
00153     };
00154  
00158     struct PCL_EXPORTS ISMModel
00159     {
00161       ISMModel ();
00162 
00164       ISMModel (ISMModel const & copy);
00165 
00167       virtual
00168       ~ISMModel ();
00169 
00173       bool
00174       saveModelToFile (std::string& file_name);
00175 
00179       bool
00180       loadModelFromfile (std::string& file_name);
00181 
00183       void
00184       reset ();
00185 
00187       ISMModel & operator = (const ISMModel& other);
00188 
00190       std::vector<std::vector<float> > statistical_weights_;
00191 
00193       std::vector<float> learned_weights_;
00194 
00196       std::vector<unsigned int> classes_;
00197 
00199       std::vector<float> sigmas_;
00200 
00202       Eigen::MatrixXf directions_to_center_;
00203 
00205       Eigen::MatrixXf clusters_centers_;
00206 
00208       std::vector<std::vector<unsigned int> > clusters_;
00209 
00211       unsigned int number_of_classes_;
00212 
00214       unsigned int number_of_visual_words_;
00215 
00217       unsigned int number_of_clusters_;
00218 
00220       unsigned int descriptors_dimension_;
00221 
00222       EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00223     };
00224   }
00225 
00226   namespace ism
00227   {
00239     template <int FeatureSize, typename PointT, typename NormalT = pcl::Normal>
00240     class PCL_EXPORTS ImplicitShapeModelEstimation
00241     {
00242       public:
00243 
00244         typedef boost::shared_ptr<pcl::features::ISMModel> ISMModelPtr;
00245 
00246       protected:
00247 
00249         struct PCL_EXPORTS LocationInfo
00250         {
00257           LocationInfo (unsigned int model_num, const PointT& dir_to_center, const PointT& origin, const NormalT& normal) :
00258             model_num_ (model_num),
00259             dir_to_center_ (dir_to_center),
00260             point_ (origin),
00261             normal_ (normal) {};
00262 
00264           unsigned int model_num_;
00265 
00267           PointT dir_to_center_;
00268 
00270           PointT point_;
00271 
00273           NormalT normal_;
00274         };
00275 
00278         typedef struct PCL_EXPORTS TC
00279         {
00280           enum
00281           {
00282             COUNT = 1,
00283             EPS = 2
00284           };
00285 
00291           TC(int type, int max_count, float epsilon) :
00292             type_ (type),
00293             max_count_ (max_count),
00294             epsilon_ (epsilon) {};
00295 
00302           int type_;
00303 
00305           int max_count_;
00306 
00308           float epsilon_;
00309         } TermCriteria;
00310 
00312         struct PCL_EXPORTS VisualWordStat
00313         {
00315           VisualWordStat () :
00316             class_ (-1),
00317             learned_weight_ (0.0f),
00318             dir_to_center_ (0.0f, 0.0f, 0.0f) {};
00319 
00321           int class_;
00322 
00324           float learned_weight_;
00325 
00327           pcl::PointXYZ dir_to_center_;
00328         };
00329 
00330       public:
00331 
00333         ImplicitShapeModelEstimation ();
00334 
00336         virtual
00337         ~ImplicitShapeModelEstimation ();
00338 
00340         std::vector<typename pcl::PointCloud<PointT>::Ptr>
00341                 getTrainingClouds ();
00342 
00346         void
00347                 setTrainingClouds (const std::vector< typename pcl::PointCloud<PointT>::Ptr >& training_clouds);
00348 
00350         std::vector<unsigned int>
00351         getTrainingClasses ();
00352 
00356         void
00357         setTrainingClasses (const std::vector<unsigned int>& training_classes);
00358 
00360         std::vector<typename pcl::PointCloud<NormalT>::Ptr>
00361         getTrainingNormals ();
00362 
00366         void
00367         setTrainingNormals (const std::vector< typename pcl::PointCloud<NormalT>::Ptr >& training_normals);
00368 
00370         float
00371         getSamplingSize ();
00372 
00376         void
00377         setSamplingSize (float sampling_size);
00378 
00380         boost::shared_ptr<pcl::Feature<PointT, pcl::Histogram<FeatureSize> > >
00381         getFeatureEstimator ();
00382 
00387         void
00388         setFeatureEstimator (boost::shared_ptr<pcl::Feature<PointT, pcl::Histogram<FeatureSize> > > feature);
00389 
00391         unsigned int
00392         getNumberOfClusters ();
00393 
00397         void
00398         setNumberOfClusters (unsigned int num_of_clusters);
00399 
00401         std::vector<float>
00402         getSigmaDists ();
00403 
00410         void
00411         setSigmaDists (const std::vector<float>& training_sigmas);
00412 
00417         bool
00418         getNVotState ();
00419 
00423         void
00424         setNVotState (bool state);
00425 
00430         bool
00431         trainISM (ISMModelPtr& trained_model);
00432 
00440         boost::shared_ptr<pcl::features::ISMVoteList<PointT> >
00441         findObjects (ISMModelPtr model, typename pcl::PointCloud<PointT>::Ptr in_cloud, typename pcl::PointCloud<Normal>::Ptr in_normals, int in_class_of_interest);
00442 
00443       protected:
00444 
00450         bool
00451         extractDescriptors (std::vector<pcl::Histogram<FeatureSize> >& histograms,
00452                             std::vector<LocationInfo, Eigen::aligned_allocator<LocationInfo> >& locations);
00453 
00459         bool
00460         clusterDescriptors (std::vector< pcl::Histogram<FeatureSize> >& histograms, Eigen::MatrixXi& labels, Eigen::MatrixXf& clusters_centers);
00461 
00465         void
00466         calculateSigmas (std::vector<float>& sigmas);
00467 
00479         void
00480         calculateWeights (const std::vector< LocationInfo, Eigen::aligned_allocator<LocationInfo> >& locations,
00481                           const Eigen::MatrixXi &labels,
00482                           std::vector<float>& sigmas,
00483                           std::vector<std::vector<unsigned int> >& clusters,
00484                           std::vector<std::vector<float> >& statistical_weights,
00485                           std::vector<float>& learned_weights);
00486 
00493         void
00494         simplifyCloud (typename pcl::PointCloud<PointT>::ConstPtr in_point_cloud,
00495                        typename pcl::PointCloud<NormalT>::ConstPtr in_normal_cloud,
00496                        typename pcl::PointCloud<PointT>::Ptr out_sampled_point_cloud,
00497                        typename pcl::PointCloud<NormalT>::Ptr out_sampled_normal_cloud);
00498 
00503         void
00504         shiftCloud (typename pcl::PointCloud<PointT>::Ptr in_cloud, Eigen::Vector3f shift_point);
00505 
00511         Eigen::Matrix3f
00512         alignYCoordWithNormal (const NormalT& in_normal);
00513 
00518         void
00519         applyTransform (Eigen::Vector3f& io_vec, const Eigen::Matrix3f& in_transform);
00520 
00527         void
00528         estimateFeatures (typename pcl::PointCloud<PointT>::Ptr sampled_point_cloud,
00529                           typename pcl::PointCloud<NormalT>::Ptr normal_cloud,
00530                           typename pcl::PointCloud<pcl::Histogram<FeatureSize> >::Ptr feature_cloud);
00531 
00542         double
00543         computeKMeansClustering (const Eigen::MatrixXf& points_to_cluster,
00544                                  int number_of_clusters,
00545                                  Eigen::MatrixXi& io_labels,
00546                                  TermCriteria criteria,
00547                                  int attempts,
00548                                  int flags,
00549                                  Eigen::MatrixXf& cluster_centers);
00550 
00558         void
00559         generateCentersPP (const Eigen::MatrixXf& data,
00560                            Eigen::MatrixXf& out_centers,
00561                            int number_of_clusters,
00562                            int trials);
00563 
00568         void
00569         generateRandomCenter (const std::vector<Eigen::Vector2f>& boxes, Eigen::VectorXf& center);
00570 
00575         float
00576         computeDistance (Eigen::VectorXf& vec_1, Eigen::VectorXf& vec_2);
00577 
00579         ImplicitShapeModelEstimation&
00580         operator= (const ImplicitShapeModelEstimation&);
00581 
00582       protected:
00583 
00585         std::vector<typename pcl::PointCloud<PointT>::Ptr> training_clouds_;
00586 
00588         std::vector<unsigned int> training_classes_;
00589 
00591         std::vector<typename pcl::PointCloud<NormalT>::Ptr> training_normals_;
00592 
00596         std::vector<float> training_sigmas_;
00597 
00599         float sampling_size_;
00600 
00602         boost::shared_ptr<pcl::Feature<PointT, pcl::Histogram<FeatureSize> > > feature_estimator_;
00603 
00605         unsigned int number_of_clusters_;
00606 
00608         bool n_vot_ON_;
00609 
00613         static const int PP_CENTERS = 2;
00614 
00617         static const int USE_INITIAL_LABELS = 1;
00618     };
00619   }
00620 }
00621 
00622 POINT_CLOUD_REGISTER_POINT_STRUCT (pcl::ISMPeak,
00623   (float, x, x)
00624   (float, y, y)
00625   (float, z, z)
00626   (float, density, ism_density)
00627   (float, class_id, ism_class_id)
00628 )
00629 
00630 #endif  //#ifndef PCL_IMPLICIT_SHAPE_MODEL_H_


pcl
Author(s): Open Perception
autogenerated on Wed Aug 26 2015 15:25:00