#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/project_inliers.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/surface/concave_hull.h>
#include <pcl/visualization/pcl_visualizer.h>
#pragma comment(lib,"User32.lib")
#pragma comment(lib, "gdi32.lib")
int
main(int argc
, char** argv
)
{
pcl
::PointCloud
<pcl
::PointXYZ
>::Ptr
cloud(new pcl
::PointCloud
<pcl
::PointXYZ
>),
cloud_filtered(new pcl
::PointCloud
<pcl
::PointXYZ
>),
cloud_projected(new pcl
::PointCloud
<pcl
::PointXYZ
>);
pcl
::PCDReader reader
;
reader
.read("table_scene_mug_stereo_textured.pcd", *cloud
);
pcl
::PassThrough
<pcl
::PointXYZ
> pass
;
pass
.setInputCloud(cloud
);
pass
.setFilterFieldName("z");
pass
.setFilterLimits(0, 1.1);
pass
.filter(*cloud_filtered
);
std
::cerr
<< "PointCloud after filtering has: "
<< cloud_filtered
->points
.size() << " data points." << std
::endl
;
pcl
::ModelCoefficients
::Ptr
coefficients(new pcl
::ModelCoefficients
);
pcl
::PointIndices
::Ptr
inliers(new pcl
::PointIndices
);
pcl
::SACSegmentation
<pcl
::PointXYZ
> seg
;
seg
.setOptimizeCoefficients(true);
seg
.setModelType(pcl
::SACMODEL_PLANE
);
seg
.setMethodType(pcl
::SAC_RANSAC
);
seg
.setDistanceThreshold(0.01);
seg
.setInputCloud(cloud_filtered
);
seg
.segment(*inliers
, *coefficients
);
std
::cerr
<< "PointCloud after segmentation has: "
<< inliers
->indices
.size() << " inliers." << std
::endl
;
pcl
::ProjectInliers
<pcl
::PointXYZ
> proj
;
proj
.setModelType(pcl
::SACMODEL_PLANE
);
proj
.setInputCloud(cloud_filtered
);
proj
.setModelCoefficients(coefficients
);
proj
.filter(*cloud_projected
);
std
::cerr
<< "PointCloud after projection has: "
<< cloud_projected
->points
.size() << " data points." << std
::endl
;
pcl
::PointCloud
<pcl
::PointXYZ
>::Ptr
cloud_hull(new pcl
::PointCloud
<pcl
::PointXYZ
>);
pcl
::ConcaveHull
<pcl
::PointXYZ
> chull
;
chull
.setInputCloud(cloud_projected
);
chull
.setAlpha(0.1);
chull
.reconstruct(*cloud_hull
);
std
::cerr
<< "Concave hull has: " << cloud_hull
->points
.size()
<< " data points." << std
::endl
;
pcl
::PCDWriter writer
;
writer
.write("table_scene_mug_stereo_textured_hull.pcd", *cloud_hull
, false);
pcl
::visualization
::PCLVisualizer
::Ptr
viewer0(new pcl
::visualization
::PCLVisualizer("hull"));
viewer0
->addPointCloud(cloud
, pcl
::visualization
::PointCloudColorHandlerCustom
<pcl
::PointXYZ
>(cloud
, 0, 0, 255), "cloud");
viewer0
->setPointCloudRenderingProperties(pcl
::visualization
::PCL_VISUALIZER_POINT_SIZE
, 4, "cloud");
cout
<< "click q key to quit the visualizer and continue!!" << endl
;
pcl
::visualization
::PCLVisualizer
::Ptr
viewer1(new pcl
::visualization
::PCLVisualizer("hull"));
viewer1
->addPointCloud(cloud_hull
, pcl
::visualization
::PointCloudColorHandlerCustom
<pcl
::PointXYZ
>(cloud_hull
, 0, 255, 0), "cloud_hull");
viewer1
->setPointCloudRenderingProperties(pcl
::visualization
::PCL_VISUALIZER_POINT_SIZE
, 4, "cloud_hull");
cout
<< "click q key to quit the visualizer and continue!!" << endl
;
viewer1
->spin();
return (0);
}