[英]How can I efficiently bin 3D point cloud data based on point coordinates and desired bin grid size
我在 open3D 中有一个大点云,我想基本上制作一个 3D 网格并根据它们所在的立方体对点进行分类。其他人称之为“在 3D 空间中进行分类”。
例子:
import numpy as np
A = np.array([[ 0, -1, 10],
[ 1, -2 ,11],
[ 2, -3 ,12],
[ 3, -4 ,13],
[ 4, -5 ,14],
[ 5, -6 ,15],
[ 6, -7 ,16],
[ 7, -8 ,17],
[ 8, -9 ,18]])
#point 1: X,Y,Z
#point 2: X,Y,Z
print(A)
X_segments = np.linspace(0,8,3) #plane at beginning, middle and end - this creates 2 sections where data can be
Y_segments = np.linspace(-9,-1,3)
Z_segments = np.linspace(10,18,3)
#all of these combined form 4 cuboids where data can be
#its also possible for the data to be outside these cuboids but we can ignore that
bin1 = A where A[0,:] is > X_segments [0] and < X_segments[1]
and A where A[1,:] is > Y_segments [0] and < Y_segments[1]
and A where A[2,:] is > Z_segments [0] and < Z_segments[1]
bin2 = A where A[0,:] is > X_segments [1] and < X_segments[2]
and A where A[1,:] is > Y_segments [0] and < Y_segments[1]
and A where A[2,:] is > Z_segments [0] and < Z_segments[1]
bin3 = A where A[0,:] is > X_segments [1] and < X_segments[2]
and A where A[1,:] is > Y_segments [1] and < Y_segments[2]
and A where A[2,:] is > Z_segments [0] and < Z_segments[1]
bin4 = A where A[0,:] is > X_segments [1] and < X_segments[2]
and A where A[1,:] is > Y_segments [1] and < Y_segments[2]
and A where A[2,:] is > Z_segments [1] and < Z_segments[2]
谢谢你们!
您可以尝试以下方法:
import numpy as np
A = np.array([[ 0, -1, 10],
[ 1, -2 ,11],
[ 2, -3 ,12],
[ 3, -4 ,13],
[ 4, -5 ,14],
[ 5, -6 ,15],
[ 6, -7 ,16],
[ 7, -8 ,17],
[ 8, -9 ,18]])
X_segments = np.linspace(0,8,3)
Y_segments = np.linspace(-9,-1,3)
Z_segments = np.linspace(10,18,3)
edges = [X_segments, Y_segments, Z_segments]
print(edges) # just to show edges of the bins
我们得到:
[[ 0. 4. 8.]
[-9. -5. -1.]
[10. 14. 18.]]
接下来,沿每个坐标轴应用np.digitize
:
coords = np.vstack([np.digitize(A.T[i], b, right=True) for i, b in enumerate(edges)]).T
print(coords)
这给出了:
[[0 2 0]
[1 2 1]
[1 2 1]
[1 2 1]
[1 1 1]
[2 1 2]
[2 1 2]
[2 1 2]
[2 0 2]]
该数组的行描述了A
的相应行在 bin 网格中的位置。 例如,第二行[1, 2, 1]
表示A
的第二行,即[1, -2, 11]
在沿 X 轴的第一个 bin 中(因为0 < 1 <= 4
),在沿 Y 轴的第二个 bin 中(因为-5 < -2 <= -1
),在沿 Z 轴的第一个 bin 中(因为10 < 11 <= 14
)。 然后你可以选择属于每个长方体的元素:
# select rows of A that are in the cuboid with coordinates [1, 2, 1]
A[np.all(coords == [1, 2, 1], axis=1)]
这给出了:
array([[ 1, -2, 11],
[ 2, -3, 12],
[ 3, -4, 13]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.