特定のSDKに依存しない形で、3Dのデータを扱うためのライブラリとしてはOpen3Dがある。
- 3Dデータを扱うためのデータ形式
- 視差データを深度データに変換する。
- example
- 深度データを点群データにする。
- 点群データの座標変換を実施する
- 視点を設定して点群データを2次元画像に射影する。
- https://github.com/isl-org/Open3D/blob/main/examples/python/geometry/point_cloud_to_rgbd.py
- 結果の表示機能
- 結果の表示機能は、結果をネットワーク越しに受け渡して、作業用PCで表示させるという使い方もある。
Open3Dは、3Dデータを扱うソフトウェアの迅速な開発をサポートするオープンソースのライブラリです。 Open3Dのフロントエンドは、C++とPythonの両方で、厳選されたデータ構造とアルゴリズムのセットを公開している。 バックエンドは高度に最適化され、並列化のために設定されている。 Open3Dは、クリーンな状態から開発され、依存関係は小さく、慎重に考慮されています。 最小限の労力で、さまざまなプラットフォームでセットアップし、ソースからコンパイルすることができます。 コードはクリーンで、一貫したスタイルになっており、明確なコードレビューのメカニズムによってメンテナンスされています。 Open3Dは、多くの研究プロジェクトで使用されており、クラウドにも積極的に導入されています。 オープンソースコミュニティからの貢献を歓迎します。
プロジェクトページから和訳
- バックエンドが最適化している
- グラフィックス
- 行列演算 なので、自力でOpenGLなどを書く状況ではない。
Open3D-ML An extension of Open3D to address 3D Machine Learning tasks
RealSense とOpen3Dとの状況 https://github.com/IntelRealSense/librealsense/blob/master/wrappers/open3d/readme.md
- 画像データ・点群データ処理を行うバックエンド側のライブラリを、ユーザーはいじる必要がない。
- 画像データ・点群データの表示に関わる部分のバックエンド側のライブラリを、ユーザーはいじる必要がない。
open3d.camera.PinholeCameraIntrinsic o3d.camera.PinholeCameraIntrinsic(width=width, height=height, fx=fx, fy=fy, cx=cx, cy=cy)
OpenCVで用いるカメラ行列 camera_matrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]])
- 2Dのデータ・3Dのデータを扱う上で必要なデータに対するデータ型が用意されている。
- そのため、その型にあるメソッドやデータメンバーを調べることで、使い方がわかる。
- データの視覚化のインタフェースが簡潔化されている。
- そのため、OpenGLによる描画の部分はバックエンドとして隠れている。
- np.ndarray型、cv::Mat型のどちらでも直接的な演算を可能にしている。
- OpenCVなど、ほとんどの変数がnp.ndarray型、もしくはcv::Mat型になってしまう。
- OpenCVでは、ライブラリに多くの機能が不足しているので、視差を深度に換算するのさえ、自作のコードを必要としてしまう。
- データの所在をGPU,CPUを切り替えて演算する機能がない。
- Open3Dと名乗るだけあって、3Dのデータを扱うためのライブラリが充実している。
- Open3Dでは、それぞれの変数がそれぞれの型を持っている。そのため、Open3Dを使っている範囲では、不適切な型の変数を引数に与えるとエラーになる。
- type hintを見た時点で、変数の意味が明確になりやすい。
- Open3Dの関数を用いて実装すると、だれが書いても似たようなコードになりやすい。
- データの所在をGPU,CPUとを明示的に指定することができる。
- Open3Dのデータ型自体では、floatとの直接的な乗算・加算などができないようになっている。
- OpenGL:
- グラフィックスのためのライブラリ
- マルチプラットフォーム対応
- Open3D:
- 2Dデータ・3次元データを扱うためのライブラリ
- バックエンドとしてOpenGLを利用している。
o3d.t.geometry.PointCloud()
o3d.geometry.PointCloud()
- CPUとGPUとでデータを行き来させる状況を想定して作り直したのが Geometry (Tensor) らしい。
- だから、たいがいの場合には、
o3d.t.
で始まるライブラリを使うのがよさそうだ。 - 同じことをするスクリプトの例があったら、
o3d.t.
で始まるライブラリをまず試すこと。 - o3d.t.geometry.PointCloud()の側には、
project_to_rgbd_image()
というメソッドがある。 - o3d.geometry.PointCloud()の側には、その名前のメソッドがないだけではなく、対応する機能のメソッドを見つけられなかった。
- o3d.t.geometry.PointCloud()
- o3d.geometry.PointCloud()
- データにfloatをかけることも、足すこともできない。
3DカメラのSDKになれると、Open3Dには以下のものが含まれていないのが、物足りなくなる。
- 各データの時刻情報
- IMUのデータ
Open3DはOpenGLを内部で利用している。 OpenGLの記述能力は細かい部分まで可能であるが、ライブラリを使いこなすのがむずかしい。 Open3Dから表示させた方が、表示が楽だろう。
- ZED SDK(StereoLabs)のサンプルコードは、3DのグラフィックにOpenGLを用いている。
- 最近のC++の流儀での書き換えが進行中である。
- auto 型推定
- const の追加
- スマートポインタの利用
- CのライブラリではなくC++のライブラリの利用。
- malloc(), free() の利用している箇所は、コードの規模に対しては少なくなっている。
- 最近のC++の流儀での書き換えが進行中である。
- 画像認識・画像計測・それらの利用(ロボットの開発など)をしている人が、こういったコードを書くのに時間をさくのは難しいだろう。
- OpenGLは画像認識屋には手強すぎる
https://github.com/strawlab/python-pcl This repository has been archived by the owner on Dec 31, 2023. It is now read-only.
https://pypi.org/project/pclpy/ リリース日: 2018年8月25日 なので、python binding は最近は更新されていない。
SSII2018のTSを例題に,PCL (C++)とOpen3D (Python) の比較
まとめ
まだPCLほど高機能ではないが,Pythonで点群処理ができるのは素晴らしい.実行速度をあまり気にしないときはOpen3Dを使うのが良さげ.
各点ごとに面倒な処理をするとか,PCLにしか実装されていないとか,実行速度が重要なときとかはPCL.