Найти центр креста в облаке точек - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть облако точек креста, сделанное из двух цилиндров, взятых сверху.Я не знаю, как определить центральную точку скрещенных элементов, расположенных на верхнем краю самого высокого цилиндра?

Я еще не очень хорош в написании скриптов на Python и обнаружил библиотеку PyntCloud несколько дней назад.Моих знаний было достаточно, чтобы вырезать облако точек, взятое с камеры Intel Real-Sense, из фона (окружения) с помощью ограничивающего прямоугольника и кривизны.Я пытался упростить облако точек с помощью воксельной сетки, но теперь я не уверен, может ли это помочь мне найти центр.

output.ply - PLY используется в коде

Screen.png - Снимок экрана с отмеченными центральными точками

Кусок кода взят из Jupyter Notebook:

import numpy as np
from pyntcloud import PyntCloud

#Cropping everything that doesn't fit the curvature of shapes:
cropped_input = PyntCloud.from_file('C:\Python37\PC\output.ply')
k_neighbors = cropped_input.get_neighbors(k=1000)
ev = cropped_input.add_scalar_field("eigen_values", k_neighbors=k_neighbors)
cropped_input.add_scalar_field("curvature", ev=ev)
curvature = cropped_input.points["curvature(1001)"]
cropped_input.points = cropped_input.points[curvature > curvature.mean()]
cropped_input.to_file("C:\Python37\PC\simplified_cloud.ply")
cropped_input.plot()
#print(cropped_input)

#Use voxel grid to reduce number of points
cropped_input = PyntCloud.from_file('C:\Python37\PC\simplified_cloud.ply')
voxelgrid_id = cropped_input.add_structure("voxelgrid", n_x=30, n_y=30, n_z=30)
new_cloud = cropped_input.get_sample("voxelgrid_nearest", voxelgrid_id=voxelgrid_id, as_PyntCloud=True)
new_cloud.plot()
#print(new_cloud)

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

Заранее спасибо!

1 Ответ

0 голосов
/ 17 февраля 2019

Как я уже упоминал в комментариях, «центроид» здесь не был решением, потому что крест не был симметричным.Решение состояло в том, чтобы работать с библиотекой numpy и определить зону пересечения цилиндров относительно плотности точек, которые были взяты из numpy.histogram вдоль каждой оси и создали фильтр, основанный на этих значениях.Затем облако точек было обрезано так, чтобы сверху фигура выглядела как прямоугольник (и была почти симметричной).Только тогда я использовал маску (numpy.isin) и определил координаты и индекс ближайшей точки к центроиду.

...