点云库的Python绑定
项目描述
pclpy: PCL for python
点云库(PCL)的Python绑定。使用CppHeaderParser和pybind11从头文件生成。
这个库正在积极开发中,API可能会改变。包含的模块可以工作,但测试不完整,并且仍然存在边界情况。
目前仅支持Windows和python 3.6 x64。
欢迎贡献、问题和评论!
Github仓库: https://www.github.com/davidcaron/pclpy
Pypi: https://pypi.ac.cn/project/pclpy/
动机
许多其他Python库尝试绑定PCL。最受欢迎的是python-pcl,它使用Cython。虽然Cython非常强大,但绑定C++模板并不是它的强项(PCL大量使用模板)。python-pcl的结果是大量代码重复,难以维护和添加功能,并且PCL的类和点类型绑定不完整。
使用pybind11,我们直接使用C++。模板、boost::smart_ptr和缓冲区协议是更容易实现的例子。
到目前为止的结果非常有希望。PCL的大部分内容都得到了覆盖。
安装
Windows with python 3.6 x64
pip安装pclpy
当pip安装项目时,将安装 pclpy_dependencies
作为依赖项。这个简单的包只包含Windows上所需的PCL dlls,因此您无需下载PCL发布版或构建它。
Linux
目前无法使用。欢迎贡献!
功能
- 实现了所有点类型(由默认的msvc编译标志指定的)
- 您可以使用
cloud.x
或cloud.xyz
将点云数据视为 numpy 数组。 - pybind11 处理 boost::shared_ptr,因此在 Python 层面上完全抽象。
- laspy 集成用于读取/写入 las 文件。
示例
您可以使用高级、更 Pythonic 的 API,或者 PCL API 的包装器。包装器旨在尽可能接近原始 PCL C++ API。
以下是使用此库处理移动最小二乘法的方法。请参阅 PCL 文档:http://pointclouds.org/documentation/tutorials/resampling.php
使用高级 API
import pclpy
# read a las file
point_cloud = pclpy.read("street.las", "PointXYZRGBA")
# compute mls
output = point_cloud.moving_least_squares(search_radius=0.05, compute_normals=True, num_threads=8)
或 PCL API 的包装器
import pclpy
from pclpy import pcl
point_cloud = pclpy.read("street.las", "PointXYZRGBA")
mls = pcl.surface.MovingLeastSquaresOMP.PointXYZRGBA_PointNormal()
tree = pcl.search.KdTree.PointXYZRGBA()
mls.setSearchRadius(0.05)
mls.setPolynomialFit(False)
mls.setNumberOfThreads(12)
mls.setInputCloud(point_cloud)
mls.setSearchMethod(tree)
mls.setComputeNormals(True)
output = pcl.PointCloud.PointNormal()
mls.process(output)
您可以看到包装器非常接近 C++ 版本
// C++ version
pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::io::loadPCDFile ("bunny.pcd", *point_cloud);
pcl::MovingLeastSquaresOMP<pcl::PointXYZ, pcl::PointNormal> mls;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
mls.setSearchRadius (0.05);
mls.setPolynomialFit (false);
mls.setNumberOfThreads (12);
mls.setInputCloud (point_cloud);
mls.setSearchMethod (tree);
mls.setComputeNormals (true);
pcl::PointCloud<pcl::PointNormal> output;
mls.process (output);
模块
- 2d
- common
- geometry
- features
- filters
- io
- kdtree
- keypoints
- octree
- recognition
- sample_consensus
- search
- segmentation
- stereo
- surface
- tracking
- visualization
目前跳过了这些模块
- ml
- people
- outofcore
- registration
- 不在 PCL Windows 发布版中的每个模块(gpu、cuda 等)
未实现
(请参阅 GitHub 问题 和 generators/config.py
中的 what to skip 部分)
构建
Windows with python 3.6 x64
- 在以下位置下载 Windows 版本的 PCL 发布版(PCL-1.8.1-AllInOne-msvc2017-win64.exe):https://github.com/PointCloudLibrary/pcl/releases/download/pcl-1.8.1/PCL-1.8.1-AllInOne-msvc2017-win64.exe
- PCL_ROOT 环境变量必须设置为 PCL 的安装目录
- 关于需求
- 从 GitHub 安装 pybind11(2.3dev 版本),它包含必要的错误修复
- 从 https://github.com/davidcaron/CppHeaderParser 安装 CppHeaderParser(特定的错误修复)
- 使用
generate_pybind11_bindings.py
生成模块 - PCL 发布版中缺少一个文件,您应从 GitHub 仓库中获取:2d/impl/kernel.hpp
- 由于内存使用量大,必须使用 x64 版本的 cl.exe 构建(请参阅 setup.py 中的解决方案)
- python setup.py install
- 有用的 setup.py 参数
- --msvc-mp-build 启用多进程构建
- --msvc-no-code-link 使链接速度更快(不要用于发布版,请参阅 setup.py 描述)
- --use-clcache 使用 clcache 缓存 msvc 构建(必须安装)
- --debug 以调试模式构建
路线图
- 尽可能多地包装 PCL
- 更多测试
- 在 Appveyor 上进行 CI
- 使其在 Linux 上工作
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。