Ускорение преобразования изображения с глубиной в облако точек (Python) - PullRequest
1 голос
/ 13 июля 2020

Сейчас я пытаюсь ускорить преобразование глубины в облако точек в python. На данный момент код выглядит так:

   color_points = []
   for v in range(depth.shape[1]):
        for u in range(depth.shape[0]):
            z = depth[u,v] / self.scaling_factor
            if z == 0:   # here np.where can be used prior to the loop
                continue
            x = (u - self.center_x) * z / self.focalLength     # u and v are needed, no clue how to do this
            y = (v - self.center_y) * z / self.focalLength

            color_points.append([x, y, z])

Моя основная проблема в том, что я не знаю никакой функции (например, np.where), которая бы ускорила цикл через массив изображений, пока все еще с индексами пикселя (например, u и v). Индексы необходимы, поскольку расчет зависит от расположения пикселя на датчике.

Cython может ускорить его, но я все же думаю, что должна быть лучшая функция, доступная в пределах NumPy .

Спасибо за любую помощь!

Edit: Добавлен расчет Z в функцию. Коэффициент масштабирования зависит от формата, в котором вы получаете изображение глубины. В моем случае я получаю глубину в [мм] и конвертирую ее в метры.

1 Ответ

0 голосов
/ 13 июля 2020

Вот мой удар, использующий np.mgrid для вычисления u и v в массиве numpy, который позволяет избежать медленного цикла и позволяет использовать универсальные функции numpy.

import numpy as np
depth = np.random.uniform(size=(4,4)) # Just so this sample can be run
grid = np.mgrid[0:depth.shape[0],0:depth.shape[1]]
u, v = grid[0], grid[1]
z = depth / scaling_factor
adjusted_z = z / focal_length
x = (u - center_x) * adjusted_z
y = (v - center_y) * adjusted_z
color_points = np.stack([x,y,z], axis=-1).reshape(-1,3)

Обратите внимание, что я не отфильтровывал color_points для z=0, но вы можете сделать это с помощью color_points[z.reshape(-1) != 0]. Также имейте в виду, что мой color_points будет заказан иначе, чем ваш (u перед v). Вероятно, это не имеет значения в сценарии оценки глубины ios.

...