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 #ifndef JSK_RECOGNITION_UTILS_GEO_CONVEX_POLYGON_H_
00037 #define JSK_RECOGNITION_UTILS_GEO_CONVEX_POLYGON_H_
00038
00039 #include "jsk_recognition_utils/geo/polygon.h"
00040 #include <pcl/segmentation/extract_polygonal_prism_data.h>
00041 #include <pcl/filters/project_inliers.h>
00042 #include <pcl/surface/convex_hull.h>
00043 #include "jsk_recognition_utils/pcl_util.h"
00044
00045
00046 namespace jsk_recognition_utils
00047 {
00048 class ConvexPolygon: public Polygon
00049 {
00050 public:
00051 typedef boost::shared_ptr<ConvexPolygon> Ptr;
00052 typedef Eigen::Vector3f Vertex;
00053 typedef std::vector<Eigen::Vector3f,
00054 Eigen::aligned_allocator<Eigen::Vector3f> > Vertices;
00055
00056 ConvexPolygon(const Vertices& vertices);
00057 ConvexPolygon(const Vertices& vertices,
00058 const std::vector<float>& coefficients);
00059
00060 virtual void project(const Eigen::Vector3f& p, Eigen::Vector3f& output);
00061 virtual void project(const Eigen::Vector3d& p, Eigen::Vector3d& output);
00062 virtual void project(const Eigen::Vector3d& p, Eigen::Vector3f& output);
00063 virtual void project(const Eigen::Vector3f& p, Eigen::Vector3d& output);
00064 virtual void projectOnPlane(const Eigen::Vector3f& p,
00065 Eigen::Vector3f& output);
00066 virtual void projectOnPlane(const Eigen::Affine3f& p,
00067 Eigen::Affine3f& output);
00068 virtual bool isProjectableInside(const Eigen::Vector3f& p);
00069
00070 virtual ConvexPolygon flipConvex();
00071 virtual Eigen::Vector3f getCentroid();
00072 virtual Ptr magnify(const double scale_factor);
00073 virtual Ptr magnifyByDistance(const double distance);
00074
00075 static ConvexPolygon fromROSMsg(const geometry_msgs::Polygon& polygon);
00076 static ConvexPolygon::Ptr fromROSMsgPtr(const geometry_msgs::Polygon& polygon);
00077 bool distanceSmallerThan(
00078 const Eigen::Vector3f& p, double distance_threshold);
00079 bool distanceSmallerThan(
00080 const Eigen::Vector3f& p, double distance_threshold,
00081 double& output_distance);
00082 bool allEdgesLongerThan(double thr);
00083 double distanceFromVertices(const Eigen::Vector3f& p);
00084 geometry_msgs::Polygon toROSMsg();
00085 protected:
00086
00087 private:
00088 };
00089
00090 template<class PointT>
00091 ConvexPolygon::Ptr convexFromCoefficientsAndInliers(
00092 const typename pcl::PointCloud<PointT>::Ptr cloud,
00093 const pcl::PointIndices::Ptr inliers,
00094 const pcl::ModelCoefficients::Ptr coefficients) {
00095 typedef typename pcl::PointCloud<PointT> POINTCLOUD;
00096 typename POINTCLOUD::Ptr projected_cloud(new pcl::PointCloud<PointT>);
00097
00098 if (inliers->indices.size() == 0) {
00099 return ConvexPolygon::Ptr();
00100 }
00101
00102 pcl::ProjectInliers<PointT> proj;
00103 proj.setModelType(pcl::SACMODEL_PERPENDICULAR_PLANE);
00104 proj.setInputCloud(cloud);
00105 proj.setModelCoefficients(coefficients);
00106 proj.setIndices(inliers);
00107 proj.filter(*projected_cloud);
00108
00109 {
00110 boost::mutex::scoped_lock lock(global_chull_mutex);
00111 typename POINTCLOUD::Ptr convex_cloud(new pcl::PointCloud<PointT>);
00112 pcl::ConvexHull<PointT> chull;
00113 chull.setDimension(2);
00114 chull.setInputCloud (projected_cloud);
00115 chull.reconstruct (*convex_cloud);
00116 if (convex_cloud->points.size() > 0) {
00117
00118 Vertices vs;
00119 for (size_t i = 0; i < convex_cloud->points.size(); i++) {
00120 Eigen::Vector3f v(convex_cloud->points[i].getVector3fMap());
00121 vs.push_back(v);
00122 }
00123 return ConvexPolygon::Ptr(new ConvexPolygon(vs));
00124 }
00125 else {
00126 return ConvexPolygon::Ptr();
00127 }
00128 }
00129 }
00130 }
00131
00132 #endif