计算凸包算法
来自 pcl从入门到精通
- 提取任意多边形
构造凸多边形,提取或者剔除任意多边形
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/crop_hull.h>
#include <pcl/surface/concave_hull.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
using namespace pcl;
int main(int argc, const char** argv) {
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>());
PointCloud<PointXYZ>::Ptr cloudout(new PointCloud<PointXYZ>());
//构造变形顶点
PointCloud<PointXYZ>::Ptr ployin(new PointCloud<PointXYZ>());
PointCloud<PointXYZ>::Ptr ploygon(new PointCloud<PointXYZ>());
PCDReader RD;
RD.read("/home/n1/notes/pcl/ploygon/pig.pcd",*cloud);
ployin->push_back(PointXYZ(0.1,0.1,0));
ployin->push_back(PointXYZ(0.1,-0.1,0));
ployin->push_back(PointXYZ(-0.1,0.1,0));
ployin->push_back(PointXYZ(-0.1,-0.1,0));
ployin->push_back(PointXYZ(-0.2,-0.2,0));
ployin->push_back(PointXYZ(0.15,0.1,0));
//构造凸包
ConvexHull<PointXYZ> HULL;
HULL.setInputCloud(ployin);
HULL.setDimension(2); //设置多边形的维数 2维
std::vector<pcl::Vertices> polygons;
//std::vector<uint32_t> vertices;
HULL.reconstruct(*ploygon,polygons); //计算凸包
//多边形滤波
CropHull<PointXYZ> SURF_HULL;
SURF_HULL.setDim(2);
SURF_HULL.setInputCloud(cloud); //查找的点云
SURF_HULL.setHullIndices(polygons); //凸包的索引值
SURF_HULL.setHullCloud(ploygon); //凸包的点云
SURF_HULL.setCropOutside(false); //false剔除 true 提取
SURF_HULL.filter(*cloudout);
boost::shared_ptr<pcl::visualization::PCLVisualizer> for_visualizer_v (new pcl::visualization::PCLVisualizer ("crophull display"));
for_visualizer_v->setBackgroundColor(255,255,255);
//在原始数据上显示凸包
int v1(0);
for_visualizer_v->createViewPort (0.0, 0.0, 0.33, 1, v1);
for_visualizer_v->setBackgroundColor (255, 255, 255, v1);
for_visualizer_v->addPointCloud (cloud,"cloud",v1);
for_visualizer_v->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,255,0,0,"cloud");
for_visualizer_v->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"cloud");
for_visualizer_v->addPolygon<pcl::PointXYZ>(ploygon,0,.069*255,0.2*255,"ployin",v1);
//显示凸包
int v2(0);
for_visualizer_v->createViewPort (0.33, 0.0, 0.66, 1, v2);
for_visualizer_v->setBackgroundColor (255, 255, 255, v2);
for_visualizer_v->addPointCloud (ploygon,"surface_hull",v2);
for_visualizer_v->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,255,0,0,"surface_hull");
for_visualizer_v->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,8,"surface_hull");
for_visualizer_v->addPolygon<pcl::PointXYZ>(ploygon,0,.069*255,0.2*255,"ploygon",v2);
//搜索结果
int v3(0);
for_visualizer_v->createViewPort (0.66, 0.0, 1, 1, v3);
for_visualizer_v->setBackgroundColor (255, 255, 255, v3);
for_visualizer_v->addPointCloud (cloudout,"cloudout",v3);
for_visualizer_v->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,255,0,0,"cloudout");
for_visualizer_v->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"cloudout");
while (!for_visualizer_v->wasStopped())
{
for_visualizer_v->spinOnce(1000);
}
return 0;
}