桌子模型
下载:https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_lms400.pcd
代码
1#include <iostream>
2#include <pcl/io/pcd_io.h>
3#include <pcl/point_types.h>
4#include <pcl/point_cloud.h>
5#include <pcl/visualization/pcl_visualizer.h>
6#include <pcl/filters/extract_indices.h>
7#include <pcl/segmentation/sac_segmentation.h>
8#include <vtkPoints.h>
9#include <vtkPolyData.h>
10#include <vtkActor.h>
11#include <vtkRenderer.h>
12#include <vtkRenderWindow.h>
13#include <vtkPolyDataMapper.h>
14#include <vtkInteractorStyle.h>
15#include <vtkRenderWindowInteractor.h>
16#include <vtkProperty.h>
17#include <vtkCellArray.h>
18#include <vtkInteractorStyleTrackballCamera.h>
19
20VTK_MODULE_INIT(vtkRenderingOpenGL);
21VTK_MODULE_INIT(vtkInteractionStyle);
22
23// VTK绘制剩下的点云
24void drawSegment(pcl::PointIndices &indices, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
25{
26 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
27 vtkSmartPointer<vtkCellArray> vertices = vtkSmartPointer<vtkCellArray>::New();
28 for (int i: (indices).indices) {
29 vtkIdType pid[1];
30 pid[0] = points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y,
31 cloud->at(i).z);
32 vertices->InsertNextCell(1, pid);
33 }
34 vtkPolyData *polyData = vtkPolyData::New();
35 polyData->SetPoints(points);
36 polyData->SetVerts(vertices);
37
38 vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
39 mapper->SetInputData(polyData);
40
41 vtkActor *actor = vtkActor::New();
42 actor->SetMapper(mapper);
43 actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
44 actor->GetProperty()->SetPointSize(3);
45
46 vtkRenderer *renderer = vtkRenderer::New();
47 renderer->AddActor(actor);
48 renderer->SetBackground(.0, .0, .0);//set background
49
50 vtkRenderWindow *renderwind = vtkRenderWindow::New();
51 renderwind->AddRenderer(renderer);
52
53 vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
54
55 vtkRenderWindowInteractor *renderwindIt = vtkRenderWindowInteractor::New();
56 renderwindIt->SetRenderWindow(renderwind);
57 renderwindIt->SetInteractorStyle(style);
58
59 renderwind->Render();
60 renderwindIt->Start();
61}
62
63int main()
64{
65 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_source(new pcl::PointCloud<pcl::PointXYZ>);
66 std::string fileName = getenv("HOME") + std::string("/data_set/table_scene_lms400.pcd");
67 std::cout << fileName << std::endl;
68 pcl::io::loadPCDFile(fileName, *cloud_source);
69 // 模型系数
70 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
71 // 点索引数组
72 pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
73 pcl::SACSegmentation<pcl::PointXYZ> sac;
74 sac.setInputCloud(cloud_source);
75 // 提取方法
76 sac.setMethodType(pcl::SAC_RANSAC);
77 // 提取的物体模型
78 sac.setModelType(pcl::SACMODEL_PLANE);
79 sac.setDistanceThreshold(0.01);
80 sac.setMaxIterations(100);
81 sac.setProbability(0.95);
82 sac.segment(*inliers, *coefficients);
83 // 拟合系数
84 std::cout << *coefficients << std::endl;
85
86 // 绘制分割后的点云
87 drawSegment(*inliers, cloud_source);
88}
运行结果
header:
seq: 0 stamp: 0 frame_id:
values[]
values[0]: -0.00691321
values[1]: -0.875345
values[2]: -0.48345
values[3]: -1.17686
参考
https://pcl.readthedocs.io/projects/tutorials/en/master/planar_segmentation.html#planar-segmentation