博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCL点云分割(2)
阅读量:7264 次
发布时间:2019-06-29

本文共 4282 字,大约阅读时间需要 14 分钟。

关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,然后我用kinect获取数据

观察到kinect获取的原始图像的,然后使用简单的滤波,把在其中的NANS点移除,因为很多的算法要求不能出现NANS点,我们可以看见这里面有充电宝,墨水,乒乓球,一双筷子,下面是两张纸,上面分别贴了两道黑色的胶带,我们首先就可以做一个提取原始点云的平面的实验,那么如果提取点云中平面,之前有一些基本的实例,使用平面分割法

程序如下

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main (int argc, char** argv){ // 读取文件 pcl::PCDReader reader; pcl::PointCloud
::Ptr cloud (new pcl::PointCloud
), cloud_f (new pcl::PointCloud
); pcl::PointCloud
::Ptr final (new pcl::PointCloud
); reader.read ("out0.pcd", *cloud); std::cout << "PointCloud before filtering has: " << cloud->points.size () << " data points." << std::endl; //* // 下采样,体素叶子大小为0.01 pcl::VoxelGrid
vg; pcl::PointCloud
::Ptr cloud_filtered (new pcl::PointCloud
); vg.setInputCloud (cloud); vg.setLeafSize (0.01f, 0.01f, 0.01f); vg.filter (*cloud_filtered); std::cout << "PointCloud after filtering has: " << cloud_filtered->points.size () << " data points." << std::endl; //* pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); pcl::PointIndices::Ptr inliers (new pcl::PointIndices); // Create the segmentation object pcl::SACSegmentation
seg; // Optional seg.setOptimizeCoefficients (true); // Mandatory seg.setModelType (pcl::SACMODEL_PLANE); // seg.setModelType (pcl::SACMODEL_LINE ); seg.setMethodType (pcl::SAC_RANSAC); seg.setDistanceThreshold (0.01); seg.setInputCloud (cloud_filtered); seg.segment (*inliers, *coefficients); if (inliers->indices.size () == 0) { PCL_ERROR ("Could not estimate a planar model for the given dataset."); return (-1); } std::cerr << "Model coefficients: " << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << " " << coefficients->values[3] <

运行生成的可执行文件会输出平面模型的参数

                                                               平面模型的参数

                                                                      此图是采样后的点云图

也可以在这个程序中直接实现平面的提取,但是为了更好的说明,我是将获取平面参数与平面提取给分成两个程序实现,程序如下

#include 
#include
#include
#include
#include
#include
#include
#include
#include
boost::shared_ptr
simpleVis (pcl::PointCloud
::ConstPtr cloud){ boost::shared_ptr
viewer (new pcl::visualization::PCLVisualizer ("3D Viewer")); viewer->setBackgroundColor (0, 0, 0); viewer->addPointCloud
(cloud, "project_inliners cloud"); viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); //viewer->addCoordinateSystem (1.0, "global"); viewer->initCameraParameters (); return (viewer);}int main (int argc, char** argv){ // 读取文件 pcl::PCDReader reader; pcl::PointCloud
::Ptr cloud (new pcl::PointCloud
), cloud_f (new pcl::PointCloud
); pcl::PointCloud
::Ptr cloud_projected (new pcl::PointCloud
); pcl::PointCloud
::Ptr final (new pcl::PointCloud
); reader.read ("out0.pcd", *cloud); std::cout << "PointCloud before filtering has: " << cloud->points.size () << " data points." << std::endl; //* // 下采样,体素叶子大小为0.01 pcl::VoxelGrid
vg; pcl::PointCloud
::Ptr cloud_filtered (new pcl::PointCloud
); vg.setInputCloud (cloud); vg.setLeafSize (0.01f, 0.01f, 0.01f); vg.filter (*cloud_filtered); std::cout << "PointCloud after filtering has: " << cloud_filtered->points.size () << " data points." << std::endl; //* // Create a set of planar coefficients with X=Y= pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ()); coefficients->values.resize (4); coefficients->values[0] = 0.140101; coefficients->values[1] = 0.126715; coefficients->values[2] = 0.981995; coefficients->values[3] = -0.702224; // Create the filtering object pcl::ProjectInliers
proj; proj.setModelType (pcl::SACMODEL_PLANE); proj.setInputCloud (cloud_filtered); proj.setModelCoefficients (coefficients); proj.filter (*cloud_projected); boost::shared_ptr
viewer; viewer = simpleVis(cloud_projected); while (!viewer->wasStopped ()) { viewer->spinOnce (100); boost::this_thread::sleep (boost::posix_time::microseconds (100000)); } return (0);}

执行结果就如下

提取了平面,**********************8

微信公众号号可扫描二维码一起共同学习交流

转载地址:http://drrdm.baihongyu.com/

你可能感兴趣的文章
计算机常用端口一览表
查看>>
态度以及业余付出决定程序生涯
查看>>
Datapump数据迁移的实践总结
查看>>
为什么要避免标题关键词重复?
查看>>
高性能--解决mysql连接和进程故障
查看>>
搜索引擎网页去重算法解析
查看>>
C++对象模型(虽然在GCC下很大的不同,但是先收藏)
查看>>
[20150314]256列.txt
查看>>
SAP QM Partial Lot
查看>>
[20151201]备份迁移sql profile.txt
查看>>
【FSFA 读书笔记】Ch4 Volume Analysis & Cr 5 PC-based Partitions
查看>>
penoffice2.4安装参考
查看>>
win7下硬盘安装win7+CentOS双系统方法
查看>>
[译]JavaScript规范-葵花宝典
查看>>
引用 - PHP手册笔记
查看>>
几个问题的思考
查看>>
hidden&nbsp;change事件
查看>>
SQLServer 扫盲
查看>>
No handler for type [text] declared on field [content]
查看>>
Timer Swing
查看>>