sac_model_circle.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  *  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  * $Id$
00038  *
00039  */
00040 
00041 #ifndef PCL_SAMPLE_CONSENSUS_MODEL_CIRCLE2D_H_
00042 #define PCL_SAMPLE_CONSENSUS_MODEL_CIRCLE2D_H_
00043 
00044 #include <pcl/sample_consensus/sac_model.h>
00045 #include <pcl/sample_consensus/model_types.h>
00046 
00047 namespace pcl
00048 {
00059   template <typename PointT>
00060   class SampleConsensusModelCircle2D : public SampleConsensusModel<PointT>
00061   {
00062     public:
00063       using SampleConsensusModel<PointT>::input_;
00064       using SampleConsensusModel<PointT>::indices_;
00065       using SampleConsensusModel<PointT>::radius_min_;
00066       using SampleConsensusModel<PointT>::radius_max_;
00067       using SampleConsensusModel<PointT>::error_sqr_dists_;
00068 
00069       typedef typename SampleConsensusModel<PointT>::PointCloud PointCloud;
00070       typedef typename SampleConsensusModel<PointT>::PointCloudPtr PointCloudPtr;
00071       typedef typename SampleConsensusModel<PointT>::PointCloudConstPtr PointCloudConstPtr;
00072 
00073       typedef boost::shared_ptr<SampleConsensusModelCircle2D> Ptr;
00074 
00079       SampleConsensusModelCircle2D (const PointCloudConstPtr &cloud, bool random = false) 
00080         : SampleConsensusModel<PointT> (cloud, random), tmp_inliers_ () 
00081       {};
00082 
00088       SampleConsensusModelCircle2D (const PointCloudConstPtr &cloud, 
00089                                     const std::vector<int> &indices,
00090                                     bool random = false)
00091         : SampleConsensusModel<PointT> (cloud, indices, random), tmp_inliers_ ()
00092       {};
00093 
00097       SampleConsensusModelCircle2D (const SampleConsensusModelCircle2D &source) :
00098         SampleConsensusModel<PointT> (), tmp_inliers_ () 
00099       {
00100         *this = source;
00101       }
00102       
00104       virtual ~SampleConsensusModelCircle2D () {}
00105 
00109       inline SampleConsensusModelCircle2D&
00110       operator = (const SampleConsensusModelCircle2D &source)
00111       {
00112         SampleConsensusModel<PointT>::operator=(source);
00113         tmp_inliers_ = source.tmp_inliers_;
00114         return (*this);
00115       }
00116 
00122       bool 
00123       computeModelCoefficients (const std::vector<int> &samples, 
00124                                 Eigen::VectorXf &model_coefficients);
00125 
00130       void 
00131       getDistancesToModel (const Eigen::VectorXf &model_coefficients, 
00132                            std::vector<double> &distances);
00133 
00139       void 
00140       selectWithinDistance (const Eigen::VectorXf &model_coefficients, 
00141                             const double threshold, 
00142                             std::vector<int> &inliers);
00143 
00150       virtual int
00151       countWithinDistance (const Eigen::VectorXf &model_coefficients, 
00152                            const double threshold);
00153 
00160       void 
00161       optimizeModelCoefficients (const std::vector<int> &inliers, 
00162                                  const Eigen::VectorXf &model_coefficients, 
00163                                  Eigen::VectorXf &optimized_coefficients);
00164 
00171       void 
00172       projectPoints (const std::vector<int> &inliers, 
00173                      const Eigen::VectorXf &model_coefficients, 
00174                      PointCloud &projected_points, 
00175                      bool copy_data_fields = true);
00176 
00182       bool 
00183       doSamplesVerifyModel (const std::set<int> &indices, 
00184                             const Eigen::VectorXf &model_coefficients, 
00185                             const double threshold);
00186 
00188       inline pcl::SacModel 
00189       getModelType () const { return (SACMODEL_CIRCLE2D); }
00190 
00191     protected:
00195       bool 
00196       isModelValid (const Eigen::VectorXf &model_coefficients);
00197 
00201       bool
00202       isSampleGood(const std::vector<int> &samples) const;
00203 
00204     private:
00206       const std::vector<int> *tmp_inliers_;
00207 
00208 #if defined BUILD_Maintainer && defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ > 3
00209 #pragma GCC diagnostic ignored "-Weffc++"
00210 #endif
00211 
00212       struct OptimizationFunctor : pcl::Functor<float>
00213       {
00219         OptimizationFunctor (int m_data_points, pcl::SampleConsensusModelCircle2D<PointT> *model) : 
00220           pcl::Functor<float>(m_data_points), model_ (model) {}
00221 
00227         int 
00228         operator() (const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
00229         {
00230           for (int i = 0; i < values (); ++i)
00231           {
00232             // Compute the difference between the center of the circle and the datapoint X_i
00233             float xt = model_->input_->points[(*model_->tmp_inliers_)[i]].x - x[0];
00234             float yt = model_->input_->points[(*model_->tmp_inliers_)[i]].y - x[1];
00235             
00236             // g = sqrt ((x-a)^2 + (y-b)^2) - R
00237             fvec[i] = sqrtf (xt * xt + yt * yt) - x[2];
00238           }
00239           return (0);
00240         }
00241 
00242         pcl::SampleConsensusModelCircle2D<PointT> *model_;
00243       };
00244 #if defined BUILD_Maintainer && defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ > 3
00245 #pragma GCC diagnostic warning "-Weffc++"
00246 #endif
00247   };
00248 }
00249 
00250 #ifdef PCL_NO_PRECOMPILE
00251 #include <pcl/sample_consensus/impl/sac_model_circle.hpp>
00252 #endif
00253 
00254 #endif  //#ifndef PCL_SAMPLE_CONSENSUS_MODEL_CIRCLE2D_H_


pcl
Author(s): Open Perception
autogenerated on Wed Aug 26 2015 15:32:16