gpt4 book ai didi

算法或命令行工具来抽取地形点的点云?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:56:25 25 4
gpt4 key购买 nike

我需要获取比所需的激光雷达测量点(经度、纬度和海拔)列表更大(更密集)的地形定义,并根据二维网格对其进行抽取。这个想法是最终得到基于使用经度、纬度 (x,y) 值的 NxN(即 1 米 x 1 米)维度网格的点,因此消除了超出需要的点。目标是确定抽取后网格中每个点的高程,而不是将高程用作抽取规则本身的一部分。

实际或精确结构化的网格不是必需的,也不是这里的目标,我只使用网格术语来最好地近似我所设想的点云的剩余部分,在以我们始终有一个点的方式减少它之后在一定半径内(即 1 米)。可能有比网格更好的术语。

如果我可以从抽取算法开始,或者使用可能已经存在的可以在 Ubuntu 上运行的项目中执行此操作的命令行工具,我想用脚本或编程语言自己编写代码/脚本,并且作为系统调用从我们的应用程序中调用。该方法不应要求使用基于 GUI 类型的软件或工具来解决此问题。它需要成为一组自动化步骤的一部分。

数据当前存在于制表符分隔值文件中,但如果使用数据库/sql 查询驱动算法会更好/更快,我可以将数据加载到 sqlite 数据库文件中。理想的脚本语言是 ruby​​ 或 python,但实际上可以是任何语言,如果已经存在用于此的 C/C++/C# 库,那么我们可以根据需要包装它们。

想法?

更新阐明此抽取列表结果的用途:给定用户的位置(通过纬度和经度已知),列表中最近的点是什么,进而是它的高度?我们现在当然可以这样做,但是我们拥有的数据比必要的多,所以我们只想放宽数据的密度,这样如果我们可以在公差距离(即 1 米)内找到最近的点,如果能够使用抽取列表与完整列表。列表中的纬度、经度值是十进制GPS(即38.68616190027656,-121.11013105991036)

最佳答案

第 1 部分:精简版

  • 加载数据

从表格文件加载数据(根据您使用的分隔符更改 sep):

# installed as dependency
import pandas as pd
# https://github.com/daavoo/pyntcloud
from pyntcloud import PyntCloud

dense = PyntCloud(pd.read_csv("example.tsv",
sep='\t',
names=["x","y","z"]))

这是我创建的示例的样子:

example

  • 构建体素网格

假设文件中的纬度和经度以米为单位,您可以生成如下网格:

grid_id = dense.add_structure("voxelgrid",
sizes=[1, 1,None],
bb_cuboid=False)
voxelgrid = dense.voxelgrids[grid_id]

此体素网格在 x(纬度)和 y(经度)维度上的大小为 1。

  • 构建精简版

    decimated = dense.get_sample("voxelgrid_centroids", voxelgrid=grid_id)

decimated 是一个 numpy (N,3) 数组。您可以将其存储在 SQL 数据库等中以备后用。


第 2 部分:查询

选项A:查询体素网格

  • 获取每个网格单元的平均高度

对于网格中的每个单元格,您可以得到一个具有平均 z(高度)值的向量:

z_mean = voxelgrid.get_feature_vector(mode="z_mean")
  • 查询包含用户位置的网格:

    users_location = np.random.rand(100000, 2)

添加一列零,因为查询需要 3D(这不会影响结果):

users_location = np.c_[ users_location, np.zeros(users_location.shape[0]) ]

获取每个用户所在的单元格:

users_cell = voxelgrid.query(users_location)

最后,获取每个用户对应的高度:

users_altitude = z_mean[users_cell]

选项B:使用抽取版本进行查询

  • 构建抽取的 KDTree:

    从 scipy.spatial 导入 cKDTreekdt = cKDTree(抽取)

  • 使用用户位置查询 KDTree:

    users_location = np.random.rand(100000, 2)users_location = np.c_[ users_location, np.zeros(users_location.shape[0])

    distances, indices = kdt.query(user_locations, k=1, n_jobs=-1)


另外,您可以使用 pickle 保存和加载体素网格:

pickle.dump(voxelgrid, open("voxelgrid.pkl", "wb"))

voxelgrid = pickle.load(open("voxelgrid.pkl", "rb"))

关于算法或命令行工具来抽取地形点的点云?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43297953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com