Point Cloud Library (PCL)  1.3.1
sift_keypoint.h
Go to the documentation of this file.
00001 /*
00002  * Software License Agreement (BSD License)
00003  *
00004  *  Copyright (c) 2010, 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_SIFT_KEYPOINT_H_
00037 #define PCL_SIFT_KEYPOINT_H_
00038 
00039 #include <pcl/keypoints/keypoint.h>
00040 
00041 namespace pcl
00042 {
00043   template<typename PointT>
00044   struct SIFTKeypointFieldSelector
00045   {
00046     inline float operator ()(const PointT & p) const
00047     {
00048       return p.intensity;
00049     }
00050   };
00051   template<>
00052   struct SIFTKeypointFieldSelector<PointNormal>
00053   {
00054     inline float operator ()(const PointNormal & p) const
00055     {
00056       return p.curvature;
00057     }
00058   };
00059   template<>
00060   struct SIFTKeypointFieldSelector<PointXYZRGB>
00061   {
00062     inline float operator ()(const PointXYZRGB & p) const
00063     {
00064       return ((299*p.r + 587*p.g + 114*p.b)/1000.0f);
00065     }
00066   };
00067 
00081   template <typename PointInT, typename PointOutT>
00082   class SIFTKeypoint : public Keypoint<PointInT, PointOutT>
00083   {
00084     public:
00085       typedef typename Keypoint<PointInT, PointOutT>::PointCloudIn PointCloudIn;
00086       typedef typename Keypoint<PointInT, PointOutT>::PointCloudOut PointCloudOut;
00087       typedef typename Keypoint<PointInT, PointOutT>::KdTree KdTree;
00088 
00089       using Keypoint<PointInT, PointOutT>::name_;
00090       using Keypoint<PointInT, PointOutT>::input_;
00091       using Keypoint<PointInT, PointOutT>::indices_;
00092       using Keypoint<PointInT, PointOutT>::surface_;
00093       using Keypoint<PointInT, PointOutT>::tree_;
00094 
00096       SIFTKeypoint () : min_scale_ (0.0), nr_octaves_ (0), nr_scales_per_octave_ (0), 
00097         min_contrast_ (-std::numeric_limits<float>::max ()), scale_idx_ (-1)
00098       {
00099         name_ = "SIFTKeypoint";
00100       }
00101 
00107       void 
00108       setScales (float min_scale, int nr_octaves, int nr_scales_per_octave);
00109 
00113       void 
00114       setMinimumContrast (float min_contrast);
00115 
00116     protected:
00121       void 
00122       detectKeypoints (PointCloudOut &output);
00123 
00124     private:
00132       void 
00133       detectKeypointsForOctave (const PointCloudIn &input, KdTree &tree, 
00134                                 float base_scale, int nr_scales_per_octave, 
00135                                 PointCloudOut &output);
00136 
00143       void 
00144       computeScaleSpace (const PointCloudIn &input, KdTree &tree, 
00145                          const std::vector<float> &scales, 
00146                          Eigen::MatrixXf &diff_of_gauss);
00147 
00155       void 
00156       findScaleSpaceExtrema (const PointCloudIn &input, KdTree &tree, 
00157                              const Eigen::MatrixXf &diff_of_gauss,
00158                              std::vector<int> &extrema_indices, std::vector<int> &extrema_scales);
00159 
00160 
00162       float min_scale_;
00163 
00165       int nr_octaves_;
00166 
00168       int nr_scales_per_octave_;
00169 
00171       float min_contrast_;
00172 
00175       int scale_idx_;
00176 
00178       std::vector<sensor_msgs::PointField> out_fields_;
00179 
00180       SIFTKeypointFieldSelector<PointInT> getFieldValue_;
00181   };
00182 }
00183 
00184 #include "pcl/keypoints/impl/sift_keypoint.hpp"
00185 
00186 #endif // #ifndef PCL_SIFT_KEYPOINT_H_
00187 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines