Realsenseで取得したデータをOpen3Dで3次元再構成する方法
3Dスキャン
3Dデータを作る3Dスキャンの方法として、Realsenseを使った方法とPhotogrammetry(フォトグラメトリ)を使った方法を以下の記事で紹介しました。
この記事ではRealsenseで取得した複数の画像データとDepthMapから、Open3Dというソフトを使って3次元再構成する方法を紹介します。原理的には最新のiPhoneのLiDARを使った3DスキャンとかSLAMの一歩手前という感じでしょうか(詳細原理までは解説しませんし、私も理解できていません)。
この記事では、とりあえずやってみましたという内容です。この記事で扱うOpen3Dというソフトに関しては、以下のブログ記事参照ください。
3Dスキャンの手順
やっていることは、Open3Dの以下のチュートリアルの手順を簡略化・日本語化して紹介しているだけです。より詳しく知りたい人は、以下のチュートリアルを参照してください。
環境としてはLinux PCが前提です。Mac(Apple Silicon)では、Realsenseでのデータの取得はできましたが、3次元再構成でlibc++abi: terminating with uncaught exception of type pybind11::stop_iteration:
というエラーでこけました。がんばれば直せる気がしますが、やっていません。WindowsではRealsenseでのデータ取得は実施できていませんが、WSL2で3次元再構成はできました。。
以下の手順が必要です。1,2は1回やればOKです。
- Realsenseのセットアップ
- Open3Dでの3次元構成環境セットアップ
- Realsenseでデータ取得
- Open3Dで3次元構成
- 3Dデータ確認
順に説明していきます。
Realsenseのセットアップ
以下記事を参考にセットアップしてください。
realsense-viewerで動作確認できる状態になっていればOKです。
Open3Dでの3次元構成環境セットアップ
Python環境は、今回仮想環境としてpyenv/pyenv-virtualenvを使った手順を説明します。他に好きな環境がある場合は、各自読み替えてください。
pyenv/pyenv-virtualenvのインストールは以下参照ください。
以下で仮想環境を作って入ります。
$ pyenv global 3.8.12
$ pyenv virtualenv 3.8.12 open3d
$ pyenv global 3.8.12/envs/open3d
必要なライブラリをインストールします。
$ python -m pip install open3d==0.15.2
$ python -m pip install pyrealsense2
$ python -m pip install opencv-python
Open3Dのコードをダウンロードします。スクリプトをいくつか自分の使いやすいようにカスタムしたものを使用するため、オリジナルのリポジトリでなく、自分がforkしたリポジトリを使用します。
$ cd && git clone --depth 1 -b custom https://github.com/karaage0703/Open3D
ここで--depth 1 -b custom
のオプションつけているのは、Open3Dのリポジトリのサイズが大きいので、必要な特定のブランチを指定して最新版だけをもってくるようにしています。--depth 1
はネットワークや時間に余裕があれば、つけなくてもOKです。
オリジナルのリポジトリを使いたい場合は以下コマンドを実行してください。
$ cd && git clone --depth 1 -b v0.15.1 https://github.com/isl-org/Open3D
これ以降は、ホームディレクトリ直下の~/Open3D
にディレクトリがある想定で説明していきます。
オリジナルのリポジトリを使用する場合は、以下の設定ファイルを作成します(カスタムしたリポジトリを使用する場合は、以下ファイルはすでに用意されているので作成の作業は不要です)。
~/Open3D/examples/python/reconstruction_system/config/realsense_img.json
記載する内容は以下です。
{
"name": "Realsense image file",
"path_dataset": "dataset/realsense",
"path_intrinsic": "dataset/realsense/camera_intrinsic.json",
"depth_max": 3.0,
"voxel_size": 0.05,
"depth_diff_max": 0.07,
"preference_loop_closure_odometry": 0.1,
"preference_loop_closure_registration": 5.0,
"tsdf_cubic_size": 3.0,
"icp_method": "color",
"global_registration": "ransac",
"python_multi_threading": true
}
Realsenseでデータ取得
Realsenseでデータを取得します。以下コマンドを実行すると、ウィンドウが開きRealsenseのプレビュー画面が表示されます。データは起動直後から自動的に取得されます。
$ cd ~/Open3D/examples/python/reconstruction_system/sensors/
$ python realsense_recorder.py --record_imgs
色々な方向にカメラを向けて、データをとりましょう。ウィンドウの上でESCボタンを押すと終了できます。~/Open3D/examples/python/reconstruction_system/dataset/
というディレクトリにデータが格納されていればOKです。
オリジナルのスクリプトは、色がRGBでなくBGRだったり、色々使い勝手悪かったりしたので、カスタムしたリポジトリでは、このスクリプトを好みで修正しています。
Open3Dで3次元構成
以下コマンドを実行すると、3次元再構成が開始します。
$ cd ~/Open3D/examples/python/reconstruction_system
$ python run_system.py config/realsense_img.json --make --register --refine --integrate
データ量にもよりますが、数分かかります。
3Dデータ確認
MeshLabというソフトで確認します。入ってなければ、以下コマンドでインストールしてください。
$ sudo apt -y install meshlab
File -> Import Mesh
で以下にあるファイルを開きます。
dataset/realsense/scene/integrated.ply
以下のように3次元データが表示されたらOKです。
ミクさんでテスト
参考リンク
関連記事
Discussion
はじめまして。いつも拝見しております。
記事の通りに実行しましたが、デプスカメラからのデータ取り込みは終わり、run_system.pyの実行時に以下のようなエラーになります。
何かヒントをいただけないでしょうか。データを取り直しても同じエラーが出ます。
OSはUbuntu 22.04.4 LTS、Pythonは記事の通り、pyenvで3.8.12を指定しています。
コメントありがとうございます。最近は使ってないのですぐ答えられないです。誰かやさしい人が回答してくださることに期待してます。すみません。