Open3D:RealSenseを使った3次元点群処理

本記事は以下に示す秋月秀一先生の参考リンクをRealSense D435iを使ってやってみただけのメモ。第24回画像センシングシンポジウム(SSII2018)の チュートリアル講演「3D物体検出とロボットビジョンへの応用 -3D点群処理の基礎と位置姿勢推定のしくみ-」のために用意した資料とのこと。Open3Dのバージョンが違いAPIが変更になったのでその部分だけを変更している。PCLと比較して圧倒的に簡単なのがわかった。

参考資料

環 境

  • Ubuntu 18.04
  • Open3D  0.9.0
  • Python  3.6

準 備

ビルド

  • $ cd ~/src
  • $ git clone  https://github.com/sakizuki/SSII2018_Tutorial_Open3D.git
  • $ cd  SSII2018_Tutorial_Open3D
  • $ mkdir build
  • $ cd build
  • $ cmake ../
  • $ make

RGB画像と距離画像の取得

  • RealSenseをパソコンに接続
  • 端末で次のコマンドを実行
    • $ cd ~/src/SSII2018_Tutorial_Open3D/build
    • $ ./rs-capture
  • “depth”と”image”ディレクトが作成され、RGB画像と距離画像が保存される。放おっておくとずっとキャプチャし続けれので良いところで止める。rs-captureを実行している端末で”Ctrl+C”により実行を終了する。
  • 次のコマンドで画像が何番目まで保存されているか確認する。
    • $ ls depth
      • depth00000.pngから多くのファイルが連番で表示される。
    • $ ls image
      • depth00000.pngから多くのファイルが連番で表示される。

ポイントクラウドの取得

  • 上で取得したdepthとimage画像からポイントクラウドを取得する。取得にはrgbd_and_pcd.pyスクリプトを使う。ただし、githubにあるソースコードはOpen3Dのバージョン0.9.0には対応していないのでAPIを改変して次のコードを使った。
    # RGBD画像の表示 rgbd_and_pcd.py
    # https://github.com/sakizuki/SSII2018_Tutorial_Open3D 
    # Open3D 0.9.0に対応
    #from open3d import *
    import open3d as o3d
    import matplotlib.pyplot as plt
    import numpy as np
    
    file_num = "00150" # 
    
    if __name__ == "__main__":
        color_raw = o3d.io.read_image("../build/image/image"+file_num+".png")
        depth_raw = o3d.io.read_image("../build/depth/depth"+file_num+".png")
        camera_intrinsic = o3d.io.read_pinhole_camera_intrinsic("../data/d435.json")
        print( camera_intrinsic )
        #rgbd_image = o3d.geometry.create_rgbd_image_from_color_and_depth( color_raw, depth_raw )
        rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(color_raw, depth_raw) #API変更
    
        #print(rgbd_image)
        plt.subplot(1, 2, 1)
        plt.title('Grayscale image')
        plt.imshow(rgbd_image.color)
        plt.subplot(1, 2, 2)
        plt.title('Depth image')
        plt.imshow(rgbd_image.depth)
        plt.show()
    
        #pcd = o3d.io.create_point_cloud_from_rgbd_image(rgbd_image, camera_intrinsic)
        pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, camera_intrinsic) #API変更
    
        print(np.asarray(pcd.points))
        print("\n")
    
        # o3d.io.draw_geometries([pcd])
        o3d.visualization.draw_geometries([pcd])  # API変更
        print("save point cloud")
        o3d.io.write_point_cloud(file_num+".ply", pcd)
    
    
  • 実行
    • $ ~/src/SSII2018_Tutorial_Open3D/Python
    • $ python3  ./rgbd_and_pcd.py
    • 実行すると以下のウインドウが現れる。右上の☓印をクリックしてウインドウを閉じる。

    • ポイントクラウドが表示される。これは壁をキャプチャしたので平面らしきものが表示されている。

    • このようにウインドウに表示される他に、プログラムで設定したファイル番号名.plyの3Dフォーマットファイルが実行したディレクトに保存される。この例では”00150.ply”ができる。
  • 3Dフォーマットファイルの表示
    • ウインドウで表示されたポイントクラウドと同じか、meshlabを使って生成された3Dフォーマットファイルを表示してみよう。同じ形状のポイントクラウドが表示されることがわかる。

    • ポイントクラウドをマウスでドラッグして真横からみてみましょう。3DカメラStructure Coreと比較してなんだか波打っている。

準備ができたので、次は定量的にStructure CoreとRealSenseを比較してみよう。

終わり

コメント

タイトルとURLをコピーしました