C++与python混合编程之点云数据读取实例

C++与python混合编程之点云数据读取实例

背景
配置好PCL后发现无法直接读取LAS数据,面向****编程后了解到LAS格式的文件一般是用LASlib(LASTools)读写数据。然而LASlib库配置起来十分繁琐,要先配置好boost、gdal、tiff等类库才能最终编译。
苦恼于白费了一上午之余,想着查查python有没有相应的LAS库,碰碰运气。这一查倒好,种类繁多,包括pylas、laspy、las、pylidar等,pylas可以直接pip install,比起编译LASlib轻松许多。
C++与python混合编程之点云数据读取实例

工具
VS2015、python3.7(确保安装python时勾选了debug版本)

1、 python读取LAS文件
点云数据小则数十M,大则数G,如果一次性读取到内存中,程序崩不崩不知道,但是代码一定不够elegant,所以最好是每次都返回一个点的XYZ,正想写一个支持iterable 的 class,发现代码不够简洁,然后想起yield就是个generator,每次都返回一个iterable对象,内存空间占用很小。
C++与python混合编程之点云数据读取实例

2、 C++中处理generator
读了半天API文档,发现并没有直接记录关于获取生成器内容的方法
C++与python混合编程之点云数据读取实例

这个问题困恼了一天半,午觉醒来脑海里飘着模模糊糊的五个字,扶床踢被惊坐起,我打开网页一查,这网页没有域名,屏幕上歪歪斜斜密密麻麻的写着“人生苦短我用python”,我横竖看了半天,才从字缝中看出字来,整个网页上都写着——“万物皆对象”五个大字!
返回的generator也是一个PyObject,则应该有属性和方法,在python中for循环中会自动调用__next__(),所以在C++代码中调用该对象的__next__()应该就能获取实际的内容。才思泉涌,指尖在键盘上飞舞,这噼里啪啦的声响不亚于我在祖安与敌互列祖谱厚度的慷慨激昂。
C++与python混合编程之点云数据读取实例

以下是LASlib中使用LASreadOpener和自己写的LASOpener类读LAS文件的代码对比,可以看出实际效果是一致的,免去了配置LASlib的繁琐(虽然解决问题的时间也足以用来配置好LASlib了)。
C++与python混合编程之点云数据读取实例
C++与python混合编程之点云数据读取实例