三维凸包算法在PCL中的应用

给出三维空间中的n个顶点,求解由这n个顶点构成的凸包表面。
求解过程:
首先任选4个点形成的一个四面体(初始凸包),然后每次新加一个点P,分两种情况:
1,P在凸包内,则可以跳过
2,P 在凸包外,对于某边,找到从这个点可以"看见"的包含该边的面S(能不能看见可以用法向量来计算,看点是否在面外侧),删除这些面S,然后用S的除该边外的另外两边与点P新构成两个面。这样遍历所有边,就将P加入该凸包中,并形成了新的凸包。
遍历所有点,最后得到整个点集的凸包。
参考文章:
三维凸包
在pcl中得到某点云模型的凸包:

#include 
#include 
#include 
#include 
#include 
using namespace pcl::console;


int
main(int argc, char** argv)
{
	// Read in the cloud data
	pcl::PCDReader reader;
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>), cloud_f(new pcl::PointCloud<pcl::PointXYZ>);
	reader.read("C:\\Users\\Administrator\\Desktop\\ConsoleApplication1\\bunny2.pcd", *cloud);
	std::cout << "PointCloud before filtering has: " << cloud->points.size() << " data points." << std::endl; //*

	pcl::ConvexHull<pcl::PointXYZ> hull;
	hull.setInputCloud(cloud);
	hull.setDimension(3);

	std::vector<pcl::Vertices> polygons;
	pcl::PointCloud<pcl::PointXYZ>::Ptr surface_hull(new pcl::PointCloud<pcl::PointXYZ>);
	hull.reconstruct(*surface_hull, polygons);

	cout << surface_hull->size() ;

	// ---------------------- Visualizer -------------------------------------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer);
	viewer->setBackgroundColor(255, 255, 255);

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handler(cloud, 255, 255, 0);
	viewer->addPointCloud(cloud, color_handler, "sample cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 6, "sample cloud");

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handlerK(surface_hull, 255, 0, 0);
	viewer->addPointCloud(surface_hull, color_handlerK, "point");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 6, "point");

	//viewer->addPolygon(surface_hull, 0, 0, 255, "polyline");
	//viewer->addPolygonMesh(surface_hull, polygons, "polyline");
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
	}

	return (0);
}


参考文章:
PCL 点云库 点云 凸包检测 Convex Hull 凸包顶点求解

运行结果:
得到点云的凸包点(红色)可视化结果如下:
三维凸包算法在PCL中的应用_第1张图片
取消注释第一行,将凸包点按顺序连接起来:
可视化结果:
三维凸包算法在PCL中的应用_第2张图片
观察到有很多线穿过兔子的内部,这种方法不能正确显示凸包。
取消注释的第二行代码,可视化结果:
三维凸包算法在PCL中的应用_第3张图片
这才正确地显示了三维模型的凸包。

参考文章:
PCL 重建点云凸包 convex hull 并且显示

你可能感兴趣的:(三维凸包算法在PCL中的应用)