[pcl::PLYReader::read] problem parsing header!

一、问题描述

RealSense保存的ply文件,用PCL可视化时,会报错,是因为RealSense保存的ply文件格式有问题。
Screenshot from 2020-07-05 21-12-00

二、问题分析

RealSense保存的ply文件格式是这样的:

ply
format ascii 1.0
comment pointcloud saved from Realsense Viewer
element vertex 87748
property float32 x
property float32 y
property float32 z
property float32 nx
property float32 ny
property float32 nz
property uchar red
property uchar green
property uchar blue
element face 173974
property list uchar int vertex_indices
end_header
-0.623535 0.499023 -0.870117 
-0.177295 0.166866 0.969908 
90 91 87 
-0.618652 0.498535 -0.869141 
-0.176508 0.172906 0.968994 
90 91 82 
-0.61377 0.497803 -0.868164 
-0.20753 0.223017 0.952468 
91 91 87
...

下面是斯坦福官方(ply格式是斯坦福编制的)的例子:

ply
format ascii 1.0
comment author: anonymous
comment object: another cube
element vertex 8
property float32 x
property float32 y
property float32 z
property red uint8                     { start of vertex color }
property green uint8
property blue uint8
element face 7
property list uint8 int32 vertex_index { number of vertices for each face }
end_header
0 0 0 255 0 0                          { start of vertex list }
0 0 1 255 0 0
0 1 1 255 0 0
0 1 0 255 0 0
1 0 0 0 0 255
1 0 1 0 0 255
1 1 1 0 0 255
1 1 0 0 0 255
...

对比一下,

先看header部分,Stanford的点云每个点有6个属性(x,y,z,red,green,blue),RealSense的点云每个点有9个属性(x,y,z,nx,ny,nz,red,green,blue);

然后看数据部分,Stanford的每行有6个数字,很明显,分别代表 x,y,z,red,green,blue。RealSense的从数据格式可以看出,每三行为一组,看出每三行一组然后就很明了了,三行一共9个数,分别代表x,y,z,nx,ny,nz,red,green,blue。

RealSense保存的ply文件问题就在这里,每个点的数据应该在同一行(即是以换行符区分点的),所以将RealSense的ply文件每一组放到一行就可以了。

像这样:

-0.623535 0.499023 -0.870117 -0.177295 0.166866 0.969908 90 91 87 
-0.618652 0.498535 -0.869141 -0.176508 0.172906 0.968994 90 91 82 
-0.61377 0.497803 -0.868164 -0.20753 0.223017 0.952468 91 91 87
...

从header中的 element vertex 87748 可以看到,一共有87748个点,手动改简直就是灾难,所以写了脚本,大家可以参考,有些小伙伴可能打不开github链接,又上传了CSDN。
脚本链接:githubCSDN

三、使用方法

1.建立如下的文件结构:
.
├── fix_realsense_ply.py
├── fixed
└── src

2.将需要修改的RealSense文件放到 src 文件夹中,然后执行命令:

python fix_realsense_ply.py

3.最后修改好的文件在 fixed 文件夹中

四、注意

如果你的ply和上面例子的一样(3行一组),则直接执行,如果是2行一组,需要将源码中vertex_size = vertex_size*3改为vertex_size = vertex_size*2,并且将fix_ply()函数里的get_fixed_vertex3()函数改为get_fixed_vertex2()。

pcl::PointCloud和pcl::PCLPointCloud2是点云PCL中两种不同的数据格式。 pcl::PointCloud是一种模板化的数据结构,用于表示包含XYZ坐标的点云数据。其中,pcl::PointXYZ是一个简单的结构体,表示一个点的XYZ坐标。而pcl::PointCloud<pcl::PointXYZ>则是一个点云,包含多个pcl::PointXYZ类型的点。 引用中给出了转化点云格式的示例代码。cloud_filtered_blob是一个pcl::PCLPointCloud2::Ptr类型的指针,用于存储PCLPointCloud2格式的点云数据。cloud_filtered是一个pcl::PointCloud<pcl::PointXYZ>::Ptr类型的指针,用于存储PointCloud<pcl::PointXYZ>格式的点云数据。 pcl::PCLPointCloud2是另一种数据格式,它是一种通用的点云数据结构,可以存储多种类型的点云数据。它是一个类模板,可以根据不同的点云数据类型进行实例化。PCLPointCloud2包含一些固定的字段,如点的坐标、颜色和法向量等,同时也可以包含自定义的字段。 引用给出了一些将pcl::PCLPointCloud2格式的点云转化为pcl::PointCloud格式的函数示例代码。这些函数可以根据不同的转化需求,选择不同的方法进行转化。 在编写程序时,我们经常遇到定义点云数据格式的情况。其中,typedef pcl::PointXYZRGB PointT;定义了一个命名为PointT的数据类型,表示一个具有XYZ坐标和RGB颜色信息的点。typedef pcl::PointCloud<PointT> PointCloudT;定义了一个命名为PointCloudT的数据类型,表示一组具有PointT类型的点云数据。 引用给出了一个例子,展示了如何使用typedef定义点云数据格式。 总结来说,pcl::PointCloud表示一个XYZ坐标的点云数据,而pcl::PCLPointCloud2是一种通用的点云数据结构,可以存储多种类型的点云数据。在编写程序时,我们可以使用不同的转化函数将这两种数据格式进行转化。同时,通过使用typedef可以方便地定义自定义的点云数据格式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [PCL学习记录-Extra-1 pcl::PCLPointCloud2::Ptr和pcl::PointCloud<pcl::PointXYZ> 点云格式区别及相互...](https://blog.csdn.net/weixin_42503785/article/details/110362740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万俟淋曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值