Open3DをPythonで扱い, numpyのndarrayと連携させてみる


このエントリーをはてなブックマークに追加
  • Open3Dで点群データを扱いたかったのでインストールしてトレーニングしてみる
  • 特に、CSVファイルからx,y,zのデータを呼び出してデータを取り扱いたかったので、まずはそれをやってみる
  • 環境は、MacOSXでpython3.6.5


Open3Dをinstallする


  • あと、公式のチュートリアルを最初やってるときに、/path/to/Open3D/examples/Python/Basic/rgbd_redwood.pyを動作させてみたところ、なんかエラーが起きて動かなかった
    • open3d.open3d.geometry.RGBDImage has no attribute "create_from_color_and_depth"ってのがでてきた
    • github公式でもissueがたってた
    • 最初、ちょっとバグだから、source compileしたやつ使ってねみたいなのがあったが今度はcompileにつまって往生してた
      • 記載しないが、cmakeのところでエラーがでてどうしても進めなかった…
    • 現在issueはcloseになってるので直ったのかもしれない・・・?
    • とりあえず下記実際に行ったコマンドでちゃんと動作するのは確認できた
    • もしかしたら、サンプル動かすときにOpen3Dのディレクトリで git checkout v0.7.0 するのが大事なのか・・・?


  • 実際におこなったコマンド
1
2
3
4
5
6
7
$ pip install --upgrade pip
$ pip install open3d-python
$ git clone --recursive https://github.com/intel-isl/Open3D
$ cd Open3D
$ git checkout v0.7.0
$ cd ./examples/Python/Basic
$ python rgbd_redwood.py
  • 画像は表示されたら成功


numpyと連携させてみる


  • Open3Dには便利な機能があって、numpyのndarrayとplyのデータを相互変換できるっぽい
  • のでやってみた
  • 下記コードは適当なディレクトリで行っている
  • 上記Working with NumPy — Open3D 0.7.0 documentationは、ドキュメントが更新されていないのかちょっと仕様が異なっていたので注意
  • 途中自分用にprintデバッグしているがコメントアウトしているので無視してください

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# coding:utf-8
import copy
import numpy as np
import open3d as o3d
if __name__ == "__main__":
# generate some neat n time 3 matrix using a variant of sync function
x = np.linspace(-3, 3, 401)
# print("x is: ", x)
mesh_x, mesh_y = np.meshgrid(x, x)
# print("mesh_x: ", mesh_x)
# print("mesh_y: ", mesh_y)
z = np.sinc((np.power(mesh_x, 2) + np.power(mesh_y, 2)))
# print("z: ", z)
z_norm = (z - z.min()) / (z.max() - z.min())
# print("z_norm:", z_norm)
xyz = np.zeros((np.size(mesh_x), 3))
xyz[:, 0] = np.reshape(mesh_x, -1)
xyz[:, 1] = np.reshape(mesh_y, -1)
xyz[:, 2] = np.reshape(z_norm, -1)
# print('xyz')
# print(xyz)
# pass xyz to Open3d.o3d.Geometry.PointCloud and visualize
# o3d.geometry.PointCloud() だとAttributionErrorだった、正しく動いたのは下記
pcd = o3d.PointCloud()
# o3d.utility.Vector3dVector(xyz) だとAttributionErrorだった、正しく動いたのは下記
pcd.points = o3d.Vector3dVector(xyz)
# io.write_point_cloud("../../TestData/sync.ply", pcd) だとAttributionErrorだった、正しく動いたのは下記
o3d.write_point_cloud("./sync.ply", pcd)
# load saved point cloud and visualizze it
# io.read_point_cloud("../../TestData/sync.ply")だとAttributionErrorだった、正しく動いたのは下記
pcd_load = o3d.read_point_cloud("./sync.ply")
# print(type(pcd_load))
# visualization.draw_geometries([pcd_load])だとAttributionErrorだった、正しく動いたのは下記
o3d.draw_geometries([pcd_load])
# convert Open3D.o3d.PointCloud to numpy array
xyz_load = np.asarray(pcd_load.points)
# print(xyz_load == xyz) #=> すべてTrueが返ってくることを確認




このエントリーをはてなブックマークに追加