一、理论介绍
二、实现方式1
#include <pcl/io/pcd_io.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_line.h>
using namespace std;
int main()
{
// 加载点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("L.pcd", *cloud) < 0)
{
PCL_ERROR("\a点云文件不存在!\n");
system("pause");
return -1;
}
cout << "->加载点云个数:" << cloud->points.size() << endl;
// 空间直线拟合
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr modelLine
(new pcl::SampleConsensusModelLine<pcl::PointXYZ>(cloud)); // 指定拟合点云与几何模型
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(modelLine); // 创建随机采样一致性对象
ransac.setDistanceThreshold(0.01); // 内点到模型的最大距离
ransac.setMaxIterations(1000); // 最大迭代次数
ransac.computeModel(); // 执行RANSAC空间直线拟合
vector<int> inliers; // 存储内点索引的向量
ransac.getInliers(inliers); // 提取内点对应的索引
/// 根据索引提取内点
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudLine(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *cloudLine);
/// 模型参数
Eigen::VectorXf coefficient;
ransac.getModelCoefficients(coefficient);
cout << "直线点向式方程为:\n"
<< " (x - " << coefficient[0] << ") / " << coefficient[3]
<< " = (y - " << coefficient[1] << ") / " << coefficient[4]
<< " = (z - " << coefficient[2] << ") / " << coefficient[5];
return 0;
}
二、实现方式2
#include <iostream>
#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/segmentation/sac_segmentation.h>
using namespace std;
int main()
{
// 加载点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("L.pcd", *cloud) < 0)
{
PCL_ERROR("\a点云文件不存在!\n");
system("pause");
return -1;
}
cout << "->加载点云个数:" << cloud->points.size() << endl;
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
// Create the segmentation object
pcl::SACSegmentation<pcl::PointXYZ> seg;
// Optional
seg.setOptimizeCoefficients(true);
// Mandatory
seg.setModelType(pcl::SACMODEL_LINE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.01);
seg.setInputCloud(cloud);
seg.segment(*inliers, *coefficients);
if (inliers->indices.size() == 0)
{
PCL_ERROR("Could not estimate a line model for the given dataset.\n");
return (-1);
}
return 0;
}