要在y轴上进行拟合,只需要将代码中的模型类型(pcl::SACMODEL_LINE)改为pcl::SACMODEL_PLANE,并将模型系数设置为(0, 1, 0, 0),表示在y轴上拟合一个平面。

以下是修改后的代码:

#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/visualization/pcl_visualizer.h>

int main()
{
	// 读取点云数据
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PLYReader reader;
	reader.read("D:\\DIANYUNWENJIANJIA\\newkruskal2_ply.ply", *cloud);

	// 创建霍夫变换对象
	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.setMaxIterations(1000);
	seg.setDistanceThreshold(0.04);

	// 设置模型系数
	coefficients->values.resize(4);
	coefficients->values[0] = 0;
	coefficients->values[1] = 1;
	coefficients->values[2] = 0;
	coefficients->values[3] = 0;
	seg.setAxis(coefficients->values[0], coefficients->values[1], coefficients->values[2]);
	seg.setEpsAngle(pcl::deg2rad(5.0));

	// 执行霍夫变换
	seg.setInputCloud(cloud);
	seg.segment(*inliers, *coefficients);

	// 提取平面内点
	pcl::ExtractIndices<pcl::PointXYZ> extract;
	extract.setInputCloud(cloud);
	extract.setIndices(inliers);
	extract.setNegative(false);
	pcl::PointCloud<pcl::PointXYZ>::Ptr plane(new pcl::PointCloud<pcl::PointXYZ>);
	extract.filter(*plane);

	// 可视化结果
	pcl::visualization::PCLVisualizer viewer("3D Viewer");
	viewer.setBackgroundColor(0, 0, 0);
	viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud");
	viewer.addPointCloud<pcl::PointXYZ>(plane, "plane");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
	viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "plane");
	viewer.addCoordinateSystem(1.0);
	viewer.initCameraParameters();
	viewer.spin();

	// 保存结果
	pcl::PLYWriter writer;
	writer.write("D:\\DIANYUNWENJIANJIA\\拟合平面_ply.ply", *plane);

	return 0;
}

这段代码将在y轴上拟合一个平面,并保存提取的平面内点

#include iostream#include pclioply_ioh#include pclpoint_typesh#include pclModelCoefficientsh#include pclfiltersextract_indicesh#include pclfiltersvoxel_gridh#include pclfeaturesnormal_3dh#include pcls

原文地址: http://www.cveoy.top/t/topic/ii6R 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录