Open3D の点群を Voxel にする
Voxel はいわゆるマイクラみたいな感じです!
まずは普通に読み込み
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("vase.xyz")
o3d.visualization.draw_geometries([pcd])
Voxel 化してみる
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("vase.xyz")
voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.15)
o3d.visualization.draw_geometries([voxel])
お?黒い??ボクセル化してるっぽいけど真っ黒でよくわかりません。
色を付ける
# Voxel
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("vase.xyz")
xyz = np.asarray(pcd.points)
o = 2
c_min, c_max = np.min(xyz[:,o]), np.max(xyz[:,o])
if abs(c_min) < abs(c_max):
max = abs(c_max)
else:
max = abs(c_min)
pcd.colors = o3d.utility.Vector3dVector( [np.ones(3) * (abs(z)/max) for z in xyz[:,o]] )
voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.15)
o3d.visualization.draw_geometries([voxel])
Z軸をもとにグレイスケールで色をつけてみる。
ボクセル化されてる!
座標を取り出す
voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.15)
voxels = voxel.get_voxels()
print(voxels[0].grid_index)
print(voxels[0].color)
voxels_b = voxel.get_voxel_bounding_points([4,0,1])
print(np.asarray(voxels_b))
ボクセル化しておわりともいかないので座標を取り出す方法。
get_voxels()
でボクセルの情報が取り出せます。
grid_index
で座標がとりだせます。座標と言うかグリッド(方眼紙)の位置というか。
color
ではそこの色がとりだせます。
# voxels[0].grid_index
[4 0 1]
# voxels[0].color
[0.21738366 0.21738366 0.21738366]
get_voxel_bounding_points()
で実際の座標が取り出せます。
いわゆるキューブ(立方体・サイコロ)なので8点の座標がとりだせます。
grid_index
と get_voxel_bounding_points
を組み合わせることでボクセル化した座標が全て取り出せるので活用範囲が広がります!
# voxel.get_voxel_bounding_points([4,0,1])
[[ 0.525 -0.075 0.075]
[ 0.525 -0.075 0.225]
[ 0.675 -0.075 0.075]
[ 0.675 -0.075 0.225]
[ 0.525 0.075 0.075]
[ 0.525 0.075 0.225]
[ 0.675 0.075 0.075]
[ 0.675 0.075 0.225]]