PCL Ransac 点云平面拟合 将三维不平整表面投影到一个平面 C++代码

本文介绍如何使用PCL库进行三维点云的RANSAC平面拟合,通过调整距离阈值等参数,实现对不平整表面的近似平面化,并将点云投影到该平面上,最后用C++和VS2015实现并展示结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接(投影):https://blog.csdn.net/soaryy/article/details/82884691

参考链接(Ransac拟合):https://blog.csdn.net/weixin_41758695/article/details/85322304

利用开源的点云库PCL,使用VS2015完成的C++代码,测试文件(.obj)已经在本站(csdn)上传资源,供大家交流,如有问题欢迎多提宝贵意见

对于不平整表面,利用ransac平面拟合,然后将三维不平整表面(或者曲面)近似为一个平面,并将表面上的点投影到该平面,并且显示出来,如图所示,白色为原始点云,绿色为拟合的平面

代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <glut.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <iostream>
#include <string>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <cstdlib>
#include <vector>

using namespace pcl;
using namespace std;


int main()
{   //--------------------- Input path ----------------------------------------------
	pcl::PolygonMesh mesh;
	pcl::io::loadPolygonFile(".\\Original.obj", mesh);

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::fromPCLPointCloud2(mesh.cloud, *cloud);

	//--------------------------- Plane ---------------------------------

	pcl::SACSegmentation<pcl::PointXYZ> sac;
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>);

	sac.setInputCloud(cloud);
	sac.setMethodType(pcl::SAC_RANSAC);
	sac.setModelType(pcl::SACMODEL_PLANE);
	sac.setDistanceThreshold(15);                  //Distance need to be adjusted according to the obj
	sac.setMaxIterations(100);
	sac.setProbability(0.95); 
	sac.segment(*inliers, *coefficients);

	boost::shared_ptr<pcl::visualization::PCLVisualizer> view(new pcl::visualization::PCLVisualizer);
	view->addPointCloud(cloud);

	//Plane Model: ax+by+cz+d=0; saved in *coefficients

	float a, b, c, d;
	a = coefficients->values[0];
	b = coefficients->values[1];
	c = coefficients->values[2];
	d = coefficients->values[3];

	int i, j, k;
	int size = cloud->size();
	//------------------------ Projection ------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_proj(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointXYZ point;
	for (i = 0; i<size; i++)
	{
		float x, y, z;
		x = cloud->at(i).x;
		y = cloud->at(i).y;
		z = cloud->at(i).z;

		point.x = ((b*b + c*c)*x - a*(b*y + c*z + d)) / (a*a + b*b + c*c);
		point.y = ((a*a + c*c)*y - b*(a*x + c*z + d)) / (a*a + b*b + c*c);
		point.z = ((b*b + a*a)*z - c*(a*x + b*y + d)) / (a*a + b*b + c*c);
		cloud_proj->push_back(point);
	}

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_handler(cloud_proj, 50, 230, 12);
	view->addPointCloud(cloud_proj, color_handler, "CH");
	view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "CH");

	while (!view->wasStopped())
	{
		view->spinOnce(100);
	}

	system("pause");
	return 0;
}


 

 

### 回答1: PCL RANSAC(随机采样一致性)是一种在点云数据中进行平面拟合的算法。它广泛应用于三维重建、环境感知和机器人视觉等领域。 该算法的基本思想是通过随机采样一致性来找到与模型匹配的集。具体步骤如下: 1. 随机选择一定数量的,在点云中形成一个随机样本(seed)。 2. 根据选取的样本,计算平面模型的参数,例如平面法向量和平面的距离。 3. 对于点云中的每个,计算其到模型的距离,根据预先设定的阈值确定是否属于内(inlier)。 4. 统计属于内的个数,根据内数来评估模型的拟合度。 5. 重复前面的步骤多次,选择内最多的模型作为最佳拟合结果。 6. 可选:在内集合中重新进行平面拟合来提高拟合精度。 PCL RANSAC拟合平面的优势在于其鲁棒性和可靠性。由于对于模型参数的评估采用了统计学方法,可以有效地排除离群的影响,找到最佳拟合平面。 需要注意的是,RANSAC算法的参数设置对于拟合结果具有较大的影响,例如随机抽样的次数、内阈值或距离阈值等,需要根据具体应用场景进行合理的调整。 ### 回答2: pcl ransac(Random Sample Consensus)是一种用于拟合平面的算法。它是一种迭代的、随机的方法,用于从点云数据中找到最佳的拟合平面。该算法的基本思想是随机地选择一些数据利用这些拟合一个平面模型。然后,通过计算每个数据到这个模型的距离,将距离小于一个设定阈值的作为内分组,将距离大于阈值的作为外删除。接着,根据内重新拟合一个平面模型,计算该模型的内数。重复这个过程,直到找到了一个满足条件的最佳平面模型或达到了设定的迭代次数。 通过使用pcl ransac拟合平面c,我们可以从给定的点云中找到一个最佳的平面模型c。这个模型的特征以及模型参数可以帮助我们理解点云数据的几何结构。拟合平面c可以用于进行点云的分割、地面提取、物体识别等应用。在拟合平面c的过程中,我们可以通过调整阈值来控制拟合的精度,通过调整迭代次数来控制算法的效率。 总结来说,pcl ransac拟合平面c是一种基于随机采样的迭代算法,用于从给定的点云数据中找到一个满足条件的最佳平面模型c。这个算法可以帮助我们分析点云数据的几何结构,应用于各种场景中,如机器人感知、三维重建等。 ### 回答3: pcl ransac 是一种点云平面拟合算法,用于从点云数据中找到最佳拟合平面。对于给定的点云数据集,PCL RANSAC 首先随机从中选择一个作为初始种子根据设定的阈值确定该平面上的内。 然后,利用最小二乘方法计算该平面的法向量和拟合误差。接着,算法通过将其他投影到该拟合平面,计算投影到实际之间的距离,将距离小于设定阈值的判定为内重新估计拟合平面的参数。 该过程迭代多次,直到达到设定的迭代次数或者内个数再增加。最终,PCL RANSAC 输出最佳拟合平面的参数和内。 这种平面拟合方法在点云数据处理中有着广泛的应用。例如,在三维重建、物体识别和环境建模等领域,需要从点云中提取平面特征。 PCL RANSAC 算法通过随机抽样和迭代过程,能够在存在噪声和离群的情况下,仍然获得准确可靠的平面拟合结果。它能够克服传统方法对数据噪声敏感和对初始种子选择的依赖性的问题。 总之,PCL RANSAC 是一种高效可靠的点云平面拟合算法,能够从点云数据中提取平面特征,广泛应用于三维图像处理和计算机视觉中。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值