Point Cloud Library (PCL)  1.5.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
point_cloud_handlers.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: point_cloud_handlers.h 4702 2012-02-23 09:39:33Z gedikli $
00037  *
00038  */
00039 #ifndef PCL_POINT_CLOUD_HANDLERS_H_
00040 #define PCL_POINT_CLOUD_HANDLERS_H_
00041 
00042 #include <pcl/visualization/common/common.h>
00043 // PCL includes
00044 #include <pcl/point_types.h>
00045 #include <pcl/point_cloud.h>
00046 #include <pcl/common/io.h>
00047 // VTK includes
00048 #include <vtkSmartPointer.h>
00049 #include <vtkDataArray.h>
00050 #include <vtkUnsignedCharArray.h>
00051 #include <vtkFloatArray.h>
00052 #include <vtkPoints.h>
00053 
00054 namespace pcl
00055 {
00056   namespace visualization
00057   {
00061     template <typename PointT>
00062     class PointCloudGeometryHandler
00063     {
00064       public:
00065         typedef pcl::PointCloud<PointT> PointCloud;
00066         typedef typename PointCloud::Ptr PointCloudPtr;
00067         typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00068 
00069         typedef typename boost::shared_ptr<PointCloudGeometryHandler<PointT> > Ptr;
00070         typedef typename boost::shared_ptr<const PointCloudGeometryHandler<PointT> > ConstPtr;
00071 
00073         PointCloudGeometryHandler (const PointCloudConstPtr &cloud) :
00074           cloud_ (cloud), capable_ (false)
00075         {}
00076 
00080         virtual std::string
00081         getName () const = 0;
00082 
00084         virtual std::string
00085         getFieldName () const  = 0;
00086 
00088         inline bool
00089         isCapable () const { return (capable_); }
00090 
00094         virtual void
00095         getGeometry (vtkSmartPointer<vtkPoints> &points) const = 0;
00096 
00097       protected:
00099         PointCloudConstPtr cloud_;
00100 
00104         bool capable_;
00105 
00107         int field_x_idx_;
00108 
00110         int field_y_idx_;
00111 
00113         int field_z_idx_;
00114 
00116         std::vector<sensor_msgs::PointField> fields_;
00117     };
00118 
00120 
00124     template <typename PointT>
00125     class PointCloudGeometryHandlerXYZ : public PointCloudGeometryHandler<PointT>
00126     {
00127       public:
00128         typedef typename PointCloudGeometryHandler<PointT>::PointCloud PointCloud;
00129         typedef typename PointCloud::Ptr PointCloudPtr;
00130         typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00131 
00132         typedef typename boost::shared_ptr<PointCloudGeometryHandlerXYZ<PointT> > Ptr;
00133         typedef typename boost::shared_ptr<const PointCloudGeometryHandlerXYZ<PointT> > ConstPtr;
00134 
00136         PointCloudGeometryHandlerXYZ (const PointCloudConstPtr &cloud);
00137 
00139         virtual inline std::string
00140         getName () const { return ("PointCloudGeometryHandlerXYZ"); }
00141 
00143         virtual std::string
00144         getFieldName () const { return ("xyz"); }
00145 
00149         virtual void
00150         getGeometry (vtkSmartPointer<vtkPoints> &points) const;
00151 
00152       private:
00153         // Members derived from the base class
00154         using PointCloudGeometryHandler<PointT>::cloud_;
00155         using PointCloudGeometryHandler<PointT>::capable_;
00156         using PointCloudGeometryHandler<PointT>::field_x_idx_;
00157         using PointCloudGeometryHandler<PointT>::field_y_idx_;
00158         using PointCloudGeometryHandler<PointT>::field_z_idx_;
00159         using PointCloudGeometryHandler<PointT>::fields_;
00160     };
00161 
00163 
00168     template <typename PointT>
00169     class PointCloudGeometryHandlerSurfaceNormal : public PointCloudGeometryHandler<PointT>
00170     {
00171       public:
00172         typedef typename PointCloudGeometryHandler<PointT>::PointCloud PointCloud;
00173         typedef typename PointCloud::Ptr PointCloudPtr;
00174         typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00175 
00176         typedef typename boost::shared_ptr<PointCloudGeometryHandlerSurfaceNormal<PointT> > Ptr;
00177         typedef typename boost::shared_ptr<const PointCloudGeometryHandlerSurfaceNormal<PointT> > ConstPtr;
00178 
00180         PointCloudGeometryHandlerSurfaceNormal (const PointCloudConstPtr &cloud);
00181 
00183         virtual inline std::string
00184         getName () const { return ("PointCloudGeometryHandlerSurfaceNormal"); }
00185 
00187         virtual std::string
00188         getFieldName () const { return ("normal_xyz"); }
00189 
00193         virtual void
00194         getGeometry (vtkSmartPointer<vtkPoints> &points) const;
00195 
00196       private:
00197         // Members derived from the base class
00198         using PointCloudGeometryHandler<PointT>::cloud_;
00199         using PointCloudGeometryHandler<PointT>::capable_;
00200         using PointCloudGeometryHandler<PointT>::field_x_idx_;
00201         using PointCloudGeometryHandler<PointT>::field_y_idx_;
00202         using PointCloudGeometryHandler<PointT>::field_z_idx_;
00203         using PointCloudGeometryHandler<PointT>::fields_;
00204     };
00205 
00207 
00212     template <typename PointT>
00213     class PointCloudGeometryHandlerCustom : public PointCloudGeometryHandler<PointT>
00214     {
00215       public:
00216         typedef typename PointCloudGeometryHandler<PointT>::PointCloud PointCloud;
00217         typedef typename PointCloud::Ptr PointCloudPtr;
00218         typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00219 
00220         typedef typename boost::shared_ptr<PointCloudGeometryHandlerCustom<PointT> > Ptr;
00221         typedef typename boost::shared_ptr<const PointCloudGeometryHandlerCustom<PointT> > ConstPtr;
00222 
00224         PointCloudGeometryHandlerCustom (const PointCloudConstPtr &cloud,
00225                                          const std::string &x_field_name,
00226                                          const std::string &y_field_name,
00227                                          const std::string &z_field_name);
00228 
00230         virtual inline std::string
00231         getName () const { return ("PointCloudGeometryHandlerCustom"); }
00232 
00234         virtual std::string
00235         getFieldName () const { return (field_name_); }
00236 
00240         virtual void
00241         getGeometry (vtkSmartPointer<vtkPoints> &points) const;
00242 
00243       private:
00244         // Members derived from the base class
00245         using PointCloudGeometryHandler<PointT>::cloud_;
00246         using PointCloudGeometryHandler<PointT>::capable_;
00247         using PointCloudGeometryHandler<PointT>::field_x_idx_;
00248         using PointCloudGeometryHandler<PointT>::field_y_idx_;
00249         using PointCloudGeometryHandler<PointT>::field_z_idx_;
00250         using PointCloudGeometryHandler<PointT>::fields_;
00251 
00253         std::string field_name_;
00254     };
00255 
00257 
00260     template <>
00261     class PCL_EXPORTS PointCloudGeometryHandler<sensor_msgs::PointCloud2>
00262     {
00263       public:
00264         typedef sensor_msgs::PointCloud2 PointCloud;
00265         typedef PointCloud::Ptr PointCloudPtr;
00266         typedef PointCloud::ConstPtr PointCloudConstPtr;
00267 
00268         typedef boost::shared_ptr<PointCloudGeometryHandler<PointCloud> > Ptr;
00269         typedef boost::shared_ptr<const PointCloudGeometryHandler<PointCloud> > ConstPtr;
00270 
00272         PointCloudGeometryHandler (const PointCloudConstPtr &cloud, const Eigen::Vector4f &sensor_origin = Eigen::Vector4f::Zero ())
00273         : cloud_ (cloud)
00274         , capable_ (false)
00275         {
00276           fields_ = cloud_->fields;
00277         }
00278 
00280         virtual std::string
00281         getName () const = 0;
00282 
00284         virtual std::string
00285         getFieldName () const  = 0;
00286 
00288         inline bool
00289         isCapable () const { return (capable_); }
00290 
00294         virtual void
00295         getGeometry (vtkSmartPointer<vtkPoints> &points) const;
00296 
00297       protected:
00299         PointCloudConstPtr cloud_;
00300 
00304         bool capable_;
00305 
00307         int field_x_idx_;
00308 
00310         int field_y_idx_;
00311 
00313         int field_z_idx_;
00314 
00316         std::vector<sensor_msgs::PointField> fields_;
00317     };
00318 
00320 
00324     template <>
00325     class PCL_EXPORTS PointCloudGeometryHandlerXYZ<sensor_msgs::PointCloud2> : public PointCloudGeometryHandler<sensor_msgs::PointCloud2>
00326     {
00327       public:
00328         typedef PointCloudGeometryHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00329         typedef PointCloud::Ptr PointCloudPtr;
00330         typedef PointCloud::ConstPtr PointCloudConstPtr;
00331 
00332         typedef boost::shared_ptr<PointCloudGeometryHandlerXYZ<PointCloud> > Ptr;
00333         typedef boost::shared_ptr<const PointCloudGeometryHandlerXYZ<PointCloud> > ConstPtr;
00334 
00336         PointCloudGeometryHandlerXYZ (const PointCloudConstPtr &cloud);
00337 
00339         virtual inline
00340         std::string getName () const { return ("PointCloudGeometryHandlerXYZ"); }
00341 
00343         virtual std::string
00344         getFieldName () const { return ("xyz"); }
00345     };
00346 
00348 
00353     template <>
00354     class PCL_EXPORTS PointCloudGeometryHandlerSurfaceNormal<sensor_msgs::PointCloud2> : public PointCloudGeometryHandler<sensor_msgs::PointCloud2>
00355     {
00356       public:
00357         typedef PointCloudGeometryHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00358         typedef PointCloud::Ptr PointCloudPtr;
00359         typedef PointCloud::ConstPtr PointCloudConstPtr;
00360 
00361         typedef boost::shared_ptr<PointCloudGeometryHandlerSurfaceNormal<PointCloud> > Ptr;
00362         typedef boost::shared_ptr<const PointCloudGeometryHandlerSurfaceNormal<PointCloud> > ConstPtr;
00363 
00365         PointCloudGeometryHandlerSurfaceNormal (const PointCloudConstPtr &cloud);
00366 
00368         virtual inline std::string
00369         getName () const { return ("PointCloudGeometryHandlerSurfaceNormal"); }
00370 
00372         virtual std::string
00373         getFieldName () const { return ("normal_xyz"); }
00374     };
00375 
00377 
00382     template <>
00383     class PCL_EXPORTS PointCloudGeometryHandlerCustom<sensor_msgs::PointCloud2> : public PointCloudGeometryHandler<sensor_msgs::PointCloud2>
00384     {
00385       public:
00386         typedef PointCloudGeometryHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00387         typedef PointCloud::Ptr PointCloudPtr;
00388         typedef PointCloud::ConstPtr PointCloudConstPtr;
00389 
00391         PointCloudGeometryHandlerCustom (const PointCloudConstPtr &cloud,
00392                                          const std::string &x_field_name,
00393                                          const std::string &y_field_name,
00394                                          const std::string &z_field_name);
00395 
00397         virtual inline std::string
00398         getName () const { return ("PointCloudGeometryHandlerCustom"); }
00399 
00401         virtual std::string
00402         getFieldName () const { return (field_name_); }
00403 
00404       private:
00406         std::string field_name_;
00407     };
00408 
00410 
00413     template <typename PointT>
00414     class PointCloudColorHandler
00415     {
00416       public:
00417         typedef pcl::PointCloud<PointT> PointCloud;
00418         typedef typename PointCloud::Ptr PointCloudPtr;
00419         typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00420 
00421         typedef boost::shared_ptr<PointCloudColorHandler<PointT> > Ptr;
00422         typedef boost::shared_ptr<const PointCloudColorHandler<PointT> > ConstPtr;
00423 
00425         PointCloudColorHandler (const PointCloudConstPtr &cloud) :
00426           cloud_ (cloud), capable_ (false)
00427         {}
00428 
00430         inline bool
00431         isCapable () const { return (capable_); }
00432 
00434         virtual std::string
00435         getName () const = 0;
00436 
00438         virtual std::string
00439         getFieldName () const = 0;
00440 
00444         virtual void
00445         getColor (vtkSmartPointer<vtkDataArray> &scalars) const = 0;
00446 
00447       protected:
00449         PointCloudConstPtr cloud_;
00450 
00454         bool capable_;
00455 
00457         int field_idx_;
00458 
00460         std::vector<sensor_msgs::PointField> fields_;
00461     };
00462 
00464 
00467     template <typename PointT>
00468     class PointCloudColorHandlerRandom : public PointCloudColorHandler<PointT>
00469     {
00470       typedef typename PointCloudColorHandler<PointT>::PointCloud PointCloud;
00471       typedef typename PointCloud::Ptr PointCloudPtr;
00472       typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00473 
00474       public:
00475         typedef boost::shared_ptr<PointCloudColorHandlerRandom<PointT> > Ptr;
00476         typedef boost::shared_ptr<const PointCloudColorHandlerRandom<PointT> > ConstPtr;
00477 
00479         PointCloudColorHandlerRandom (const PointCloudConstPtr &cloud) :
00480           PointCloudColorHandler<PointT> (cloud)
00481         {
00482           capable_ = true;
00483         }
00484 
00486         virtual inline std::string
00487         getName () const { return ("PointCloudColorHandlerRandom"); }
00488 
00490         virtual std::string
00491         getFieldName () const { return ("[random]"); }
00492 
00496         virtual void
00497         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00498 
00499       protected:
00500         // Members derived from the base class
00501         using PointCloudColorHandler<PointT>::cloud_;
00502         using PointCloudColorHandler<PointT>::capable_;
00503     };
00504 
00506 
00510     template <typename PointT>
00511     class PointCloudColorHandlerCustom : public PointCloudColorHandler<PointT>
00512     {
00513       typedef typename PointCloudColorHandler<PointT>::PointCloud PointCloud;
00514       typedef typename PointCloud::Ptr PointCloudPtr;
00515       typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00516 
00517       public:
00518         typedef boost::shared_ptr<PointCloudColorHandlerCustom<PointT> > Ptr;
00519         typedef boost::shared_ptr<const PointCloudColorHandlerCustom<PointT> > ConstPtr;
00520 
00522         PointCloudColorHandlerCustom (const PointCloudConstPtr &cloud,
00523                                       double r, double g, double b)
00524           : PointCloudColorHandler<PointT> (cloud)
00525         {
00526           capable_ = true;
00527           r_ = r;
00528           g_ = g;
00529           b_ = b;
00530         }
00531 
00533         virtual inline std::string
00534         getName () const { return ("PointCloudColorHandlerCustom"); }
00535 
00537         virtual std::string
00538         getFieldName () const { return (""); }
00539 
00543         virtual void
00544         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00545 
00546       protected:
00547         // Members derived from the base class
00548         using PointCloudColorHandler<PointT>::cloud_;
00549         using PointCloudColorHandler<PointT>::capable_;
00550 
00552         double r_, g_, b_;
00553     };
00554 
00556 
00560     template <typename PointT>
00561     class PointCloudColorHandlerRGBField : public PointCloudColorHandler<PointT>
00562     {
00563       typedef typename PointCloudColorHandler<PointT>::PointCloud PointCloud;
00564       typedef typename PointCloud::Ptr PointCloudPtr;
00565       typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00566 
00567       public:
00568         typedef boost::shared_ptr<PointCloudColorHandlerRGBField<PointT> > Ptr;
00569         typedef boost::shared_ptr<const PointCloudColorHandlerRGBField<PointT> > ConstPtr;
00570 
00572         PointCloudColorHandlerRGBField (const PointCloudConstPtr &cloud);
00573 
00575         virtual std::string
00576         getFieldName () const { return ("rgb"); }
00577 
00581         virtual void
00582         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00583 
00584       protected:
00586         virtual inline std::string
00587         getName () const { return ("PointCloudColorHandlerRGBField"); }
00588 
00589       private:
00590         // Members derived from the base class
00591         using PointCloudColorHandler<PointT>::cloud_;
00592         using PointCloudColorHandler<PointT>::capable_;
00593         using PointCloudColorHandler<PointT>::field_idx_;
00594         using PointCloudColorHandler<PointT>::fields_;
00595     };
00596 
00598 
00602     template <typename PointT>
00603     class PointCloudColorHandlerHSVField : public PointCloudColorHandler<PointT>
00604     {
00605       typedef typename PointCloudColorHandler<PointT>::PointCloud PointCloud;
00606       typedef typename PointCloud::Ptr PointCloudPtr;
00607       typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00608 
00609       public:
00610         typedef boost::shared_ptr<PointCloudColorHandlerHSVField<PointT> > Ptr;
00611         typedef boost::shared_ptr<const PointCloudColorHandlerHSVField<PointT> > ConstPtr;
00612 
00614         PointCloudColorHandlerHSVField (const PointCloudConstPtr &cloud);
00615 
00617         virtual std::string
00618         getFieldName () const { return ("hsv"); }
00619 
00623         virtual void
00624         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00625 
00626       protected:
00628         virtual inline std::string
00629         getName () const { return ("PointCloudColorHandlerHSVField"); }
00630 
00632         int s_field_idx_;
00633 
00635         int v_field_idx_;
00636       private:
00637         // Members derived from the base class
00638         using PointCloudColorHandler<PointT>::cloud_;
00639         using PointCloudColorHandler<PointT>::capable_;
00640         using PointCloudColorHandler<PointT>::field_idx_;
00641         using PointCloudColorHandler<PointT>::fields_;
00642     };
00643 
00645 
00649     template <typename PointT>
00650     class PointCloudColorHandlerGenericField : public PointCloudColorHandler<PointT>
00651     {
00652       typedef typename PointCloudColorHandler<PointT>::PointCloud PointCloud;
00653       typedef typename PointCloud::Ptr PointCloudPtr;
00654       typedef typename PointCloud::ConstPtr PointCloudConstPtr;
00655 
00656       public:
00657         typedef boost::shared_ptr<PointCloudColorHandlerGenericField<PointT> > Ptr;
00658         typedef boost::shared_ptr<const PointCloudColorHandlerGenericField<PointT> > ConstPtr;
00659 
00661         PointCloudColorHandlerGenericField (const PointCloudConstPtr &cloud,
00662                                             const std::string &field_name);
00663 
00665         virtual std::string getFieldName () const { return (field_name_); }
00666 
00670         virtual void
00671         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00672 
00673       protected:
00675         virtual inline std::string
00676         getName () const { return ("PointCloudColorHandlerGenericField"); }
00677 
00678       private:
00679         using PointCloudColorHandler<PointT>::cloud_;
00680         using PointCloudColorHandler<PointT>::capable_;
00681         using PointCloudColorHandler<PointT>::field_idx_;
00682         using PointCloudColorHandler<PointT>::fields_;
00683 
00685         std::string field_name_;
00686     };
00687 
00689 
00692     template <>
00693     class PCL_EXPORTS PointCloudColorHandler<sensor_msgs::PointCloud2>
00694     {
00695       public:
00696         typedef sensor_msgs::PointCloud2 PointCloud;
00697         typedef PointCloud::Ptr PointCloudPtr;
00698         typedef PointCloud::ConstPtr PointCloudConstPtr;
00699 
00700         typedef boost::shared_ptr<PointCloudColorHandler<PointCloud> > Ptr;
00701         typedef boost::shared_ptr<const PointCloudColorHandler<PointCloud> > ConstPtr;
00702 
00704         PointCloudColorHandler (const PointCloudConstPtr &cloud) :
00705           cloud_ (cloud), capable_ (false)
00706         {}
00707 
00709         inline bool
00710         isCapable () const { return (capable_); }
00711 
00713         virtual std::string
00714         getName () const = 0;
00715 
00717         virtual std::string
00718         getFieldName () const = 0;
00719 
00723         virtual void
00724         getColor (vtkSmartPointer<vtkDataArray> &scalars) const = 0;
00725 
00726       protected:
00728         PointCloudConstPtr cloud_;
00729 
00733         bool capable_;
00734 
00736         int field_idx_;
00737     };
00738 
00740 
00743     template <>
00744     class PCL_EXPORTS PointCloudColorHandlerRandom<sensor_msgs::PointCloud2> : public PointCloudColorHandler<sensor_msgs::PointCloud2>
00745     {
00746       typedef PointCloudColorHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00747       typedef PointCloud::Ptr PointCloudPtr;
00748       typedef PointCloud::ConstPtr PointCloudConstPtr;
00749 
00750       public:
00751         typedef boost::shared_ptr<PointCloudColorHandlerRandom<PointCloud> > Ptr;
00752         typedef boost::shared_ptr<const PointCloudColorHandlerRandom<PointCloud> > ConstPtr;
00753 
00755         PointCloudColorHandlerRandom (const PointCloudConstPtr &cloud) :
00756           PointCloudColorHandler<sensor_msgs::PointCloud2> (cloud)
00757         {
00758           capable_ = true;
00759         }
00760 
00762         virtual inline std::string
00763         getName () const { return ("PointCloudColorHandlerRandom"); }
00764 
00766         virtual std::string
00767         getFieldName () const { return ("[random]"); }
00768 
00772         virtual void
00773         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00774     };
00775 
00777 
00781     template <>
00782     class PCL_EXPORTS PointCloudColorHandlerCustom<sensor_msgs::PointCloud2> : public PointCloudColorHandler<sensor_msgs::PointCloud2>
00783     {
00784       typedef PointCloudColorHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00785       typedef PointCloud::Ptr PointCloudPtr;
00786       typedef PointCloud::ConstPtr PointCloudConstPtr;
00787 
00788       public:
00790         PointCloudColorHandlerCustom (const PointCloudConstPtr &cloud,
00791                                       double r, double g, double b) :
00792           PointCloudColorHandler<sensor_msgs::PointCloud2> (cloud)
00793         {
00794           capable_ = true;
00795           r_ = r;
00796           g_ = g;
00797           b_ = b;
00798         }
00799 
00801         virtual inline std::string
00802         getName () const { return ("PointCloudColorHandlerCustom"); }
00803 
00805         virtual std::string
00806         getFieldName () const { return (""); }
00807 
00811         virtual void
00812         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00813 
00814       protected:
00816         double r_, g_, b_;
00817     };
00818 
00820 
00824     template <>
00825     class PCL_EXPORTS PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2> : public PointCloudColorHandler<sensor_msgs::PointCloud2>
00826     {
00827       typedef PointCloudColorHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00828       typedef PointCloud::Ptr PointCloudPtr;
00829       typedef PointCloud::ConstPtr PointCloudConstPtr;
00830 
00831       public:
00832         typedef boost::shared_ptr<PointCloudColorHandlerRGBField<PointCloud> > Ptr;
00833         typedef boost::shared_ptr<const PointCloudColorHandlerRGBField<PointCloud> > ConstPtr;
00834 
00836         PointCloudColorHandlerRGBField (const PointCloudConstPtr &cloud);
00837 
00841         virtual void
00842         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00843 
00844       protected:
00846         virtual inline std::string
00847         getName () const { return ("PointCloudColorHandlerRGBField"); }
00848 
00850         virtual std::string
00851         getFieldName () const { return ("rgb"); }
00852     };
00853 
00855 
00859     template <>
00860     class PCL_EXPORTS PointCloudColorHandlerHSVField<sensor_msgs::PointCloud2> : public PointCloudColorHandler<sensor_msgs::PointCloud2>
00861     {
00862       typedef PointCloudColorHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00863       typedef PointCloud::Ptr PointCloudPtr;
00864       typedef PointCloud::ConstPtr PointCloudConstPtr;
00865 
00866       public:
00867         typedef boost::shared_ptr<PointCloudColorHandlerHSVField<PointCloud> > Ptr;
00868         typedef boost::shared_ptr<const PointCloudColorHandlerHSVField<PointCloud> > ConstPtr;
00869 
00871         PointCloudColorHandlerHSVField (const PointCloudConstPtr &cloud);
00872 
00876         virtual void
00877         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00878 
00879       protected:
00881         virtual inline std::string
00882         getName () const { return ("PointCloudColorHandlerHSVField"); }
00883 
00885         virtual std::string
00886         getFieldName () const { return ("hsv"); }
00887 
00889         int s_field_idx_;
00890 
00892         int v_field_idx_;
00893      };
00894 
00896 
00900     template <>
00901     class PCL_EXPORTS PointCloudColorHandlerGenericField<sensor_msgs::PointCloud2> : public PointCloudColorHandler<sensor_msgs::PointCloud2>
00902     {
00903       typedef PointCloudColorHandler<sensor_msgs::PointCloud2>::PointCloud PointCloud;
00904       typedef PointCloud::Ptr PointCloudPtr;
00905       typedef PointCloud::ConstPtr PointCloudConstPtr;
00906 
00907       public:
00908         typedef boost::shared_ptr<PointCloudColorHandlerGenericField<PointCloud> > Ptr;
00909         typedef boost::shared_ptr<const PointCloudColorHandlerGenericField<PointCloud> > ConstPtr;
00910 
00912         PointCloudColorHandlerGenericField (const PointCloudConstPtr &cloud,
00913                                             const std::string &field_name);
00914 
00918         virtual void
00919         getColor (vtkSmartPointer<vtkDataArray> &scalars) const;
00920 
00921       protected:
00923         virtual inline std::string
00924         getName () const { return ("PointCloudColorHandlerGenericField"); }
00925 
00927         virtual std::string
00928         getFieldName () const { return (field_name_); }
00929 
00930       private:
00932         std::string field_name_;
00933     };
00934 
00935   }
00936 }
00937 
00938 #include "pcl/visualization/impl/point_cloud_handlers.hpp"
00939 
00940 #endif