はじめに
卒業研究でOpen3Dは一通り触れましたが、Open3D触り始めのとき日本語情報が少なすぎて困ったので少しまとめます。
たぶんOpen3Dを触り始めた人の多くがたどり着くであろうサイト→Open3D:http://lang.sist.chukyo-u.ac.jp/classes/Open3D/
こちらは公式チュートリアルの和訳ですが、チュートリアル以外にもたくさんできることがたくさんあります。
やりたいことがある場合は公式ドキュメントを探せば大体できます(英語ですが)。
研究で行ったのは「RGB-Dカメラ画像からの点群生成」「外れ値の除去」「点群の位置合わせ」などなど。
他に行ったのは「点群のボクセル化」「RANSACを用いた平面推定」です。
今回はOpen3Dの基本と「点群のボクセル化」について書きます(といっても関数の紹介だけですが)。
環境
- Open3D 0.9.0
- Python 3.6
Open3Dはバージョンごとに仕様が大幅に異なるので注意。
本記事ではv0.9.0対応で記述してありますが、自分も研究にはv0.7.0を使用していたので、v0.9.0では最低限の動作確認しか行っていません。
Open3Dの基本
RGB-D画像からの点群生成と可視化、pcdファイルへの読み書き
RGB-D画像からの点群生成
右上がRealSenseから取得した画像で左が生成した点群(研究では画像を切り取ってから点群生成を行いました。)
import open3d as o3d
"""
Open3DにRGB-D画像入力
"""
color = o3d.Image(color_numpy) # numpy配列から変換
depth = o3d.Image(depth_numpy)
rgbd = o3d.geometry.RGBDImage.create_rgbd_image_from_color_and_depth(color, depth, convert_rgb_to_intensity=False)
pcd = o3d.geometry.PointCloud.create_point_cloud_from_rgbd_image(rgbd, pinhole_camera_intrinsic)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) # 見やすくするための回転
pinhole_camera_intrinsicの取得方法はRealSenseなら以下の方法で取得可能。
RealSenseの設定などの処理は省いてます。
import pyrealsense2 as rs
# camera intrinsics取得
intr = profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics()
pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(intr.width, intr.height, intr.fx, intr.fy, intr.ppx, intr.ppy)
点群の可視化
o3d.visualization.draw_geometries([pcd])
点群以外にもボクセルやメッシュの可視化にも使います。
pcdファイルへの読み書き
書き込み
# バイナリでの書き込み
o3d.io.write_point_cloud("hoge.pcd", pcd)
# asciiでの書き込み
o3d.io.write_point_cloud("hoge.pcd", pcd, True)
pcdファイル以外にも出力可能です。
asciiで出力しておくと見やすいので便利です。
読み込み
pcd = o3d.io.read_point_cloud("./hoge.pcd")
点群のボクセル化
voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.03) # ボクセルのサイズ指定
o3d.visualization.draw_geometries([voxel])
Open3D触りたてのときは自分で点群のボクセル化関数を作成しましたが、もともと用意されていたらしい。。。
おわりに
今回はOpen3Dの基本についてまとめました。
時間があれば研究内容やRANSACでの平面推定についてまとめたいですが、たぶんやりません。