pcl::SampleConsensusModelLine
#include <pcl/io/pcd_io.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_line.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("straightLine.pcd", *cloud) < 0)
{
PCL_ERROR("\a点云文件不存在!\n");
system("pause");
return -1;
}
cout << "->加载点云个数:" << cloud->points.size() << endl;
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr model_line(new pcl::SampleConsensusModelLine<pcl::PointXYZ>(cloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_line);
ransac.setDistanceThreshold(0.01);
ransac.setMaxIterations(1000);
ransac.computeModel();
vector<int> inliers;
ransac.getInliers(inliers);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_line(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *cloud_line);
Eigen::VectorXf coefficient;
ransac.getModelCoefficients(coefficient);
cout << "直线点向式方程为:\n"
<< " (x - " << coefficient[0] << ") / " << coefficient[3]
<< " = (y - " << coefficient[1] << ") / " << coefficient[4]
<< " = (z - " << coefficient[2] << ") / " << coefficient[5];
pcl::SACSegmentation
1#include <iostream>
2#include <pcl/ModelCoefficients.h>
3#include <pcl/io/pcd_io.h>
4#include <pcl/point_types.h>
5#include <pcl/sample_consensus/method_types.h>
6#include <pcl/sample_consensus/model_types.h>
7#include <pcl/segmentation/sac_segmentation.h>
8
9int
10 main ()
11{
12 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
13
14
15 cloud->width = 15;
16 cloud->height = 1;
17 cloud->points.resize (cloud->width * cloud->height);
18
19
20 for (auto& point: *cloud)
21 {
22 point.x = 1024 * rand () / (RAND_MAX + 1.0f);
23 point.y = 1024 * rand () / (RAND_MAX + 1.0f);
24 point.z = 1.0;
25 }
26
27
28 (*cloud)[0].z = 2.0;
29 (*cloud)[3].z = -2.0;
30 (*cloud)[6].z = 4.0;
31
32 std::cerr << "Point cloud data: " << cloud->size () << " points" << std::endl;
33 for (const auto& point: *cloud)
34 std::cerr << " " << point.x << " "
35 << point.y << " "
36 << point.z << std::endl;
37
38 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
39 pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
40
41 pcl::SACSegmentation<pcl::PointXYZ> seg;
42
43 seg.setOptimizeCoefficients (true);
44
45 seg.setModelType (pcl::SACMODEL_LINE);
46 seg.setMethodType (pcl::SAC_RANSAC);
47 seg.setDistanceThreshold (0.01);
48
49 seg.setInputCloud (cloud);
50 seg.segment (*inliers, *coefficients);
51
52 if (inliers->indices.size () == 0)
53 {
54 PCL_ERROR ("Could not estimate a line model for the given dataset.\n");
55 return (-1);
56 }
57
58 return (0);
59}