点云库的python绑定

pclp的Python项目详细描述


pclpy:python的pcl

PyPIPyPI Python version

点云库(PCL)的Python绑定。 使用cppHeaderParser和pyBind11从头生成。

此库正在进行活动开发,API可能会更改。 所包含的模块可以工作,但测试不完整 案例仍然很常见。

目前只支持Windows和Python3.6x64。

欢迎投稿、发稿、评论!

github存储库:https://www.github.com/davidcaron/pclpy

PYPI:https://pypi.org/project/pclpy/

动机

许多其他python库试图绑定pcl。 最流行的是python pcl,它使用cython。 虽然Cython非常强大,但绑定C++模板并不是其中之一。 它的优点(PCL大量使用模板)。 python pcl的结果是大量代码重复,这很难 维护和添加PCL类的特性以及不完整的绑定 和点类型。

使用PybDun11,直接使用C++。模板,boost::smart_ptr和 缓冲协议是实现起来更简单的例子。

目前的结果非常有希望。PCL的很大一部分被覆盖。

安装

使用Python 3.6 x64的Windows

pip install pclpy

当pip安装项目时,pclpy_dependencies作为一个需求安装。 这个简单的包只包含windows上所需的pcl dll,因此您没有 下载或构建PCL版本。

Linux

暂时不工作。欢迎投稿!

功能

  • 实现所有点类型(由默认msvc编译标志指定的点类型)
  • 您可以使用cloud.xcloud.xyz
  • 将点云数据视为numpy数组。
  • boost::shared_ptr由pybind11处理,因此它在python级别完全抽象化了
  • 用于读取/写入LAS文件的Laspy集成

示例

您可以使用更高级的pythonic api,也可以使用pcl api上的包装器。 包装器意味着尽可能接近原始PCL C++API。

下面是如何使用库处理移动最小二乘法。 请参阅PCL文档:http://pointclouds.org/documentation/tutorials/resampling.php

使用更高级别的API:

importpclpy# read a las filepoint_cloud=pclpy.read("street.las","PointXYZRGBA")# compute mlsoutput=point_cloud.moving_least_squares(search_radius=0.05,compute_normals=True,num_threads=8)

或者pcl api上的包装器:

importpclpyfrompclpyimportpclpoint_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++ versionpcl::PointCloud<pcl::PointXYZ>::Ptrpoint_cloud(newpcl::PointCloud<pcl::PointXYZ>());pcl::io::loadPCDFile("bunny.pcd",*point_cloud);pcl::MovingLeastSquaresOMP<pcl::PointXYZ,pcl::PointNormal>mls;pcl::search::KdTree<pcl::PointXYZ>::Ptrtree(newpcl::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);

模块

  • 二维
  • 普通
  • 几何学
  • 功能
  • 过滤器
  • IO
  • kdtree
  • 关键点
  • 八叉树
  • 认可度
  • 样本一致性
  • 搜索
  • 分段
  • 立体声
  • 表面
  • 跟踪
  • 可视化

暂时跳过这些模块

  • 毫升
  • 离开核心
  • 注册
  • 不在PCL Windows版本中的每个模块(GPU、CUDA等)

未实现

(见github issues 以及generators/config.py中的what to skip部分

建造

使用Python 3.6 x64的Windows
  • 下载适用于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的安装目录
  • 关于要求:
  • 使用generate_pybind11_bindings.py
  • 生成模块
  • PCL版本中缺少一个文件,您应该从github repo中获取该文件:2d/impl/kernel.hpp
  • 由于占用大量内存,必须使用x64版本的cl.exe构建(请参见setup.py中的解决方法)
  • python setup.py安装
  • 有用的setup.py参数:
    • --msvc mp build应启用多进程生成
    • --msvc no code link使链接速度更快(不用于发行版,请参阅setup.py说明)
    • --使用cl使用clcache缓存msvc生成(必须安装)
    • --调试以在调试模式下生成

路线图

  • 尽可能多地包装PCL
  • 更多测试
  • 应用程序上的CI
  • 在Linux上运行

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何通过循环Id数组设置按钮Id,并使用循环设置按钮文本?   java在一个JTextField中添加字符串和int值   java如何解析2006年2月20日这样的日期?   java Android我试图从SharePreference获取数据   java如何在springboot中将ObjectId转换成字符串   java如何在ListActivity中将按钮返回工具栏   web服务如何使用免费API或web服务从java程序向手机发送短信   java Udp如何从服务器获取整数?   使用DAM资产进行java AEM JUnit测试   数组Java程序循环不会执行并提示用户?   安卓上的java改造2和xml   java 安卓中有字典数据类型吗?   java如何单元测试guice createinjector方法   java无法为Pulsar设置Zookeeper群集   java我无法解密发送消息AES   Java中的tomcat异步   java如何修复“OAutheException,errorMessage:(#803)您请求的某些别名不存在:您的(应用程序)ID}”   java通过构造函数传递整数