Point Cloud Library (PCL)
1.7.0
|
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_BOUNDARY_H_ 00042 #define PCL_BOUNDARY_H_ 00043 00044 #include <pcl/features/eigen.h> 00045 #include <pcl/features/feature.h> 00046 00047 namespace pcl 00048 { 00049 /** \brief BoundaryEstimation estimates whether a set of points is lying on surface boundaries using an angle 00050 * criterion. The code makes use of the estimated surface normals at each point in the input dataset. 00051 * 00052 * Here's an example for estimating boundary points for a PointXYZ point cloud: 00053 * \code 00054 * pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); 00055 * // fill in the cloud data here 00056 * 00057 * pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal>); 00058 * // estimate normals and fill in \a normals 00059 * 00060 * pcl::PointCloud<pcl::Boundary> boundaries; 00061 * pcl::BoundaryEstimation<pcl::PointXYZ, pcl::Normal, pcl::Boundary> est; 00062 * est.setInputCloud (cloud); 00063 * est.setInputNormals (normals); 00064 * est.setRadiusSearch (0.02); // 2cm radius 00065 * est.setSearchMethod (typename pcl::search::KdTree<PointXYZ>::Ptr (new pcl::search::KdTree<PointXYZ>) 00066 * est.compute (boundaries); 00067 * \endcode 00068 * 00069 * \attention 00070 * The convention for Boundary features is: 00071 * - if a query point's nearest neighbors cannot be estimated, the boundary feature will be set to NaN 00072 * (not a number) 00073 * - it is impossible to estimate a boundary property for a point that 00074 * doesn't have finite 3D coordinates. Therefore, any point that contains 00075 * NaN data on x, y, or z, will have its boundary feature property set to NaN. 00076 * 00077 * \author Radu B. Rusu 00078 * \ingroup features 00079 */ 00080 template <typename PointInT, typename PointNT, typename PointOutT> 00081 class BoundaryEstimation: public FeatureFromNormals<PointInT, PointNT, PointOutT> 00082 { 00083 public: 00084 typedef boost::shared_ptr<BoundaryEstimation<PointInT, PointNT, PointOutT> > Ptr; 00085 typedef boost::shared_ptr<const BoundaryEstimation<PointInT, PointNT, PointOutT> > ConstPtr; 00086 00087 using Feature<PointInT, PointOutT>::feature_name_; 00088 using Feature<PointInT, PointOutT>::getClassName; 00089 using Feature<PointInT, PointOutT>::input_; 00090 using Feature<PointInT, PointOutT>::indices_; 00091 using Feature<PointInT, PointOutT>::k_; 00092 using Feature<PointInT, PointOutT>::tree_; 00093 using Feature<PointInT, PointOutT>::search_radius_; 00094 using Feature<PointInT, PointOutT>::search_parameter_; 00095 using Feature<PointInT, PointOutT>::surface_; 00096 using FeatureFromNormals<PointInT, PointNT, PointOutT>::normals_; 00097 00098 typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut; 00099 00100 public: 00101 /** \brief Empty constructor. 00102 * The angular threshold \a angle_threshold_ is set to M_PI / 2.0 00103 */ 00104 BoundaryEstimation () : angle_threshold_ (static_cast<float> (M_PI) / 2.0f) 00105 { 00106 feature_name_ = "BoundaryEstimation"; 00107 }; 00108 00109 /** \brief Check whether a point is a boundary point in a planar patch of projected points given by indices. 00110 * \note A coordinate system u-v-n must be computed a-priori using \a getCoordinateSystemOnPlane 00111 * \param[in] cloud a pointer to the input point cloud 00112 * \param[in] q_idx the index of the query point in \a cloud 00113 * \param[in] indices the estimated point neighbors of the query point 00114 * \param[in] u the u direction 00115 * \param[in] v the v direction 00116 * \param[in] angle_threshold the threshold angle (default \f$\pi / 2.0\f$) 00117 */ 00118 bool 00119 isBoundaryPoint (const pcl::PointCloud<PointInT> &cloud, 00120 int q_idx, const std::vector<int> &indices, 00121 const Eigen::Vector4f &u, const Eigen::Vector4f &v, const float angle_threshold); 00122 00123 /** \brief Check whether a point is a boundary point in a planar patch of projected points given by indices. 00124 * \note A coordinate system u-v-n must be computed a-priori using \a getCoordinateSystemOnPlane 00125 * \param[in] cloud a pointer to the input point cloud 00126 * \param[in] q_point a pointer to the querry point 00127 * \param[in] indices the estimated point neighbors of the query point 00128 * \param[in] u the u direction 00129 * \param[in] v the v direction 00130 * \param[in] angle_threshold the threshold angle (default \f$\pi / 2.0\f$) 00131 */ 00132 bool 00133 isBoundaryPoint (const pcl::PointCloud<PointInT> &cloud, 00134 const PointInT &q_point, 00135 const std::vector<int> &indices, 00136 const Eigen::Vector4f &u, const Eigen::Vector4f &v, const float angle_threshold); 00137 00138 /** \brief Set the decision boundary (angle threshold) that marks points as boundary or regular. 00139 * (default \f$\pi / 2.0\f$) 00140 * \param[in] angle the angle threshold 00141 */ 00142 inline void 00143 setAngleThreshold (float angle) 00144 { 00145 angle_threshold_ = angle; 00146 } 00147 00148 /** \brief Get the decision boundary (angle threshold) as set by the user. */ 00149 inline float 00150 getAngleThreshold () 00151 { 00152 return (angle_threshold_); 00153 } 00154 00155 /** \brief Get a u-v-n coordinate system that lies on a plane defined by its normal 00156 * \param[in] p_coeff the plane coefficients (containing the plane normal) 00157 * \param[out] u the resultant u direction 00158 * \param[out] v the resultant v direction 00159 */ 00160 inline void 00161 getCoordinateSystemOnPlane (const PointNT &p_coeff, 00162 Eigen::Vector4f &u, Eigen::Vector4f &v) 00163 { 00164 pcl::Vector4fMapConst p_coeff_v = p_coeff.getNormalVector4fMap (); 00165 v = p_coeff_v.unitOrthogonal (); 00166 u = p_coeff_v.cross3 (v); 00167 } 00168 00169 protected: 00170 /** \brief Estimate whether a set of points is lying on surface boundaries using an angle criterion for all points 00171 * given in <setInputCloud (), setIndices ()> using the surface in setSearchSurface () and the spatial locator in 00172 * setSearchMethod () 00173 * \param[out] output the resultant point cloud model dataset that contains boundary point estimates 00174 */ 00175 void 00176 computeFeature (PointCloudOut &output); 00177 00178 /** \brief The decision boundary (angle threshold) that marks points as boundary or regular. (default \f$\pi / 2.0\f$) */ 00179 float angle_threshold_; 00180 }; 00181 } 00182 00183 #ifdef PCL_NO_PRECOMPILE 00184 #include <pcl/features/impl/boundary.hpp> 00185 #endif 00186 00187 #endif //#ifndef PCL_BOUNDARY_H_