Максимальное истощение облаков точек - PullRequest
0 голосов
/ 06 июня 2018

Моя цель состоит в том, чтобы реализовать функцию python для разбавления облака точек лидара, возвращая только точки с самыми высокими значениями z внутри каждой неперекрывающейся ячейки сетки.

Только одна точка возвращается на ячейку сетки.

Я написал следующую функцию в python, но обработка файлов примеров занимает намного больше времени (примерно на 10 медленнее) по сравнению с аналогичной реализацией в MATLAB.

Есть ли в функции что-то, что я мог бы изменить, чтобы ускорить ее?

В этой функции data - это массив Nx3, а csize - это размер неперекрывающихся ячеек сетки.

def pcthin(data, csize):
 md = data
 xx = np.arange(np.min(md[:,0]), csize*(np.ceil(max(md[:,0]))/csize), csize)
 yy = np.arange(np.min(md[:,1]), csize*(np.ceil(max(md[:,1]))/csize), csize)
 X,Y = np.meshgrid(xx,yy, sparse=False, indexing='xy')

 thindata = np.zeros_like(data)
 k = 0
 xf = X.flatten()
 yf = Y.flatten()
 for x,y in zip(xf,yf):
    tf1 = np.logical_and(md[:,0] > x, md[:,0] <= x + csize)
    tf2 = np.logical_and(md[:,1] > y, md[:,1] <= y + csize)
    tf = np.logical_and(tf1,tf2)
    if any(tf):
        dtx = md[tf,:]
        ix = np.argmax(dtx[:,2])
        thindata[k,:] = dtx[ix,:]

        k = k + 1

return thindata[0:k+1,:]

1 Ответ

0 голосов
/ 09 июня 2018

Обновление Ответ о коде

Дело в том, что наивные циклы "for" медленны в Python, и у вашего кода большой цикл for.Чтобы получить максимальную скорость для Python, вы должны либо попытаться «векторизовать» свой код , либо использовать numba и попытаться переписать свой код с помощью циклов for, как вы писали на C ++.


Старый ответ

Итак, если я правильно понимаю ваш вопрос, вот как вы могли бы сделать это, используя https://github.com/daavoo/pyntcloud


Загрузить пример облака точек:

from pyntcloud import PyntCloud
cloud = PyntCloud.from_file("tests/data/sphere.ply")

Что выглядит следующим образом:

sphere


Затем необходимо построитьсетка неперекрывающихся ячеек (называемая voxelgrid в pyntcloud).

Здесь size_x и size_y - это способ указания размера ячейки вдоль каждой оси.

voxelgrid_id = cloud.add_structure("voxelgrid", size_x=10, size_y=10)

Сетка вокселей выглядит следующим образом:

voxelgrid


И, наконец, вы можете получить новое облако точек, выбрав самую высокую точку каждой ячейки:

thinned_cloud = cloud.get_sample(
    "voxelgrid_highest",
    voxelgrid_id=voxelgrid_id,
    as_PyntCloud=True)

Что выглядит следующим образом:

thinned cloud

Вы можете получить доступ к значениям xyz нового разреженного облака точек следующим образомows:

data = thinned_cloud.xyz

Это внутренне использует pandas.groupby, что должно повысить скорость по сравнению с кодом, который вы опубликовали.Однако, если это не так быстро, я бы порекомендовал вам попробовать https://numba.pydata.org/

. Есть несколько примеров операций, которые могут быть вам полезны в https://github.com/daavoo/pyntcloud/blob/master/pyntcloud/utils/numba.py

...