Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifndef PCL_SAMPLE_CONSENSUS_MODEL_NORMALPARALLELPLANE_H_
00041 #define PCL_SAMPLE_CONSENSUS_MODEL_NORMALPARALLELPLANE_H_
00042
00043 #include <pcl/sample_consensus/sac_model.h>
00044 #include <pcl/sample_consensus/sac_model_plane.h>
00045 #include <pcl/sample_consensus/sac_model_perpendicular_plane.h>
00046 #include <pcl/sample_consensus/model_types.h>
00047
00048 namespace pcl
00049 {
00084 template <typename PointT, typename PointNT>
00085 class SampleConsensusModelNormalParallelPlane : public SampleConsensusModelPlane<PointT>, public SampleConsensusModelFromNormals<PointT, PointNT>
00086 {
00087 using SampleConsensusModel<PointT>::input_;
00088 using SampleConsensusModel<PointT>::indices_;
00089 using SampleConsensusModelFromNormals<PointT, PointNT>::normals_;
00090 using SampleConsensusModelFromNormals<PointT, PointNT>::normal_distance_weight_;
00091
00092 public:
00093
00094 typedef typename SampleConsensusModel<PointT>::PointCloud PointCloud;
00095 typedef typename SampleConsensusModel<PointT>::PointCloudPtr PointCloudPtr;
00096 typedef typename SampleConsensusModel<PointT>::PointCloudConstPtr PointCloudConstPtr;
00097
00098 typedef typename SampleConsensusModelFromNormals<PointT, PointNT>::PointCloudNPtr PointCloudNPtr;
00099 typedef typename SampleConsensusModelFromNormals<PointT, PointNT>::PointCloudNConstPtr PointCloudNConstPtr;
00100
00101 typedef boost::shared_ptr<SampleConsensusModelNormalParallelPlane> Ptr;
00102
00106 SampleConsensusModelNormalParallelPlane (const PointCloudConstPtr &cloud) :
00107 SampleConsensusModelPlane<PointT> (cloud),
00108 axis_ (Eigen::Vector4f::Zero ()),
00109 distance_from_origin_ (0),
00110 eps_angle_ (-1.0), cos_angle_ (-1.0), eps_dist_ (0.0)
00111 {
00112 }
00113
00118 SampleConsensusModelNormalParallelPlane (const PointCloudConstPtr &cloud, const std::vector<int> &indices) :
00119 SampleConsensusModelPlane<PointT> (cloud, indices),
00120 axis_ (Eigen::Vector4f::Zero ()),
00121 distance_from_origin_ (0),
00122 eps_angle_ (-1.0), cos_angle_ (-1.0), eps_dist_ (0.0)
00123 {
00124 }
00125
00129 inline void
00130 setAxis (const Eigen::Vector3f &ax) { axis_.head<3> () = ax; axis_.normalize ();}
00131
00133 inline Eigen::Vector3f
00134 getAxis () { return (axis_.head<3> ()); }
00135
00140 inline void
00141 setEpsAngle (const double ea) { eps_angle_ = ea; cos_angle_ = fabs (cos (ea));}
00142
00144 inline double
00145 getEpsAngle () { return (eps_angle_); }
00146
00150 inline void
00151 setDistanceFromOrigin (const double d) { distance_from_origin_ = d; }
00152
00154 inline double
00155 getDistanceFromOrigin () { return (distance_from_origin_); }
00156
00160 inline void
00161 setEpsDist (const double delta) { eps_dist_ = delta; }
00162
00164 inline double
00165 getEpsDist () { return (eps_dist_); }
00166
00172 void
00173 selectWithinDistance (const Eigen::VectorXf &model_coefficients,
00174 const double threshold,
00175 std::vector<int> &inliers);
00176
00183 virtual int
00184 countWithinDistance (const Eigen::VectorXf &model_coefficients,
00185 const double threshold);
00186
00191 void
00192 getDistancesToModel (const Eigen::VectorXf &model_coefficients,
00193 std::vector<double> &distances);
00194
00196 inline pcl::SacModel
00197 getModelType () const { return (SACMODEL_NORMAL_PARALLEL_PLANE); }
00198
00199 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00200
00201 protected:
00205 bool
00206 isModelValid (const Eigen::VectorXf &model_coefficients);
00207
00208 private:
00210 Eigen::Vector4f axis_;
00211
00213 double distance_from_origin_;
00214
00216 double eps_angle_;
00217
00219 double cos_angle_;
00221 double eps_dist_;
00222 };
00223 }
00224
00225 #endif //#ifndef PCL_SAMPLE_CONSENSUS_MODEL_NORMALPARALLELPLANE_H_