将 3d 点列表光栅化到 2d 画布中

问题描述 投票:0回答:1

我有一个 3D 点列表,这个列表看起来像(但包含大约 45k 点)

array([[0.77258706, 1.1149821 , 1.0494938 ],
       [0.77258706, 1.1149821 , 1.0494938 ],
       [0.77258706, 1.1149821 , 1.0494938 ],
       [1.3196146 , 1.2129393 , 0.96248001],
       [1.3197775 , 1.2117194 , 0.96213955],
       [1.3199375 , 1.2104989 , 0.96179962],
       [1.3200942 , 1.2092786 , 0.96145791],
       [1.3202487 , 1.2080572 , 0.96111906],
       [1.3204001 , 1.2068353 , 0.96078068]])

我想将它们投影到 2D 画布上。

由于点云已经正确对齐,我可以直接从点获取 x 和 y 坐标,并使用 z 分量来设置颜色(所有值都会缩放以适合画布)。

canv = np.zeros(shape=[3840, 2160, 3])
for p in ps:
    x_pos = p[0] * scale_factor
    y_pos = p[1] * scale_factor
    val =   p[2] * color_scale_factor
    canv[int(x_pos)][int(y_pos)][0:3] = colors[int(val)].get_rgb()

目前这需要大约时间。每帧 120 毫秒 (8FPS)。

有没有办法通过使用一些 numpy 魔法来显着改善这一点? 如有任何帮助,我们将不胜感激。

python arrays numpy matrix projection
1个回答
0
投票

使用 numpy 矢量化函数而不是 for 循环可能会发现一些改进,但是由于我不知道 color[val].get_rgb() 的作用,所以我无法建议解决方案。

但是,您可以尝试将函数包装在 numba jit 包装器中,这会预编译 python 代码并可以并行执行 for 循环。

import numba as nb
@nb.njit(parallel=True)
def convert(array_3d):
    canv = np.zeros(shape=[3840, 2160, 3])
    for p in array_3d:
        x_pos = p[0] * scale_factor
        y_pos = p[1] * scale_factor
        val =   p[2] * color_scale_factor
        canv[int(x_pos)][int(y_pos)][0:3] = colors[int(val)].get_rgb()
    return canv
© www.soinside.com 2019 - 2024. All rights reserved.