在点云中找到十字的中心
Find a center of a cross in point-cloud
我有一个十字点云,由从顶部截取的两个圆柱体组成。位于最高圆柱顶边的交叉元素的中心点不知道怎么确定?
我还不太擅长 Python 脚本编写,几天前发现了 'PyntCloud' 库。我的知识足以在边界框和曲率的帮助下从背景(周围)切割从英特尔实感相机拍摄的点云。我试图用体素网格简化点云,但现在我不确定它是否可以帮助我找到中心。
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)
我希望收到中心点的坐标,或从点云列表中获取的点的索引。
提前致谢!
正如我在评论中提到的,'centroid' 不是这里的解决方案,因为十字不是对称的。
解决方案是使用 numpy 库并确定与沿每个轴从 numpy.histogram 获取的点密度相关的圆柱交叉区域,并根据这些值创建一个过滤器。然后裁剪点云,使图形从顶部看起来像矩形(并且几乎是对称的)。只有这样我才使用掩码(numpy.isin)并确定离'centroid'最近的点的坐标和索引是什么。
我有一个十字点云,由从顶部截取的两个圆柱体组成。位于最高圆柱顶边的交叉元素的中心点不知道怎么确定?
我还不太擅长 Python 脚本编写,几天前发现了 'PyntCloud' 库。我的知识足以在边界框和曲率的帮助下从背景(周围)切割从英特尔实感相机拍摄的点云。我试图用体素网格简化点云,但现在我不确定它是否可以帮助我找到中心。
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)
我希望收到中心点的坐标,或从点云列表中获取的点的索引。
提前致谢!
正如我在评论中提到的,'centroid' 不是这里的解决方案,因为十字不是对称的。 解决方案是使用 numpy 库并确定与沿每个轴从 numpy.histogram 获取的点密度相关的圆柱交叉区域,并根据这些值创建一个过滤器。然后裁剪点云,使图形从顶部看起来像矩形(并且几乎是对称的)。只有这样我才使用掩码(numpy.isin)并确定离'centroid'最近的点的坐标和索引是什么。