3D点群処理ができる手軽なPythonのライブラリとして「Open3D」があります。
今回はOpen3Dを用いて、以下を実現できるプログラムを紹介します。
Open3Dの環境構築に関しては、以前に環境構築の方法を紹介しておりますので、以下の記事を参照してみてください。今回はOpen3Dは環境構築済の状態で始めたいと思います。
また、3D点群ではなく、ポリゴンを読み込む方法は以下の記事でまとめておりますので、点群ではなくポリゴンを読み込みたい方は以下の記事を参考にしてみてください。
PLYファイルは3D点群データや3Dメッシュを保存するための汎用フォーマットで、非常に広く用いられています。
点群とメッシュで記述方法が異なりますが、点群を保存したPLYファイルは、一例として以下のように記述されます。
ply
format ascii 1.0
element vertex 35947
property float x
property float y
property float z
end_header
0.365193 0.609847 0.426132
0.320558 0.615929 0.409627
0.171359 0.759521 0.636285
0.593469 0.624041 0.546527
0.462973 0.601722 0.443352
0.446901 0.596880 0.437484
0.369745 0.606694 0.408925
0.821475 0.511915 0.575211
0.852494 0.493051 0.501240
0.444329 0.511118 0.632954
0.450609 0.511555 0.637258
0.784160 0.568871 0.533686
(省略)
ヘッダの位置に点群の全点数や、ヘッダの後の数字列が何の要素を示すかの情報が記述されます。例えば「element vertex 35947」は全点数が35947点であることを示し、「property float x」「property float y」「property float z」は、ヘッダの後の数字列が(x,y,z)座標を表すことを示しています。
よってヘッダ以後(end_headerの後)は、各行が点の(x,y,z)位置を表現しています。
PLYファイルは様々なサイトで提供されていますが、点数が多くなるにつれ、データサイズも膨大になります。データサイズが大きすぎるとダウンロードに時間が掛かったり、ストレージの容量を圧迫したり、表示に時間が掛かるなど都合が悪いことが多いと思います。
そのため、今回は比較的シンプルなPLY点群ファイルとして、以下のG-PCDデータセットのポイントクラウドを用いて実験を行いたいと思いますので、もし試したい方がいましたら以下からダウンロードください。
外部サイト:G-PCD: Geometry Point Cloud Dataset ‒ MMSPG ‐ EPFL
ページ中盤の「Download」のURL Linkの位置をクリックすることでダウンロードができます。
「Bunny」「Cube」「Sphere」「Dragon」「Vase」の5種類の3D点群が提供されています。PLYファイル内に記述されているのは点の位置(x,y,z)のみで、RGB等のカラー情報は持たない点に注意してください。
今回はこちらの3D点群ファイル(PLY形式)をOpen3Dで表示してみましょう。
点群の読み込みに必要なのは8行目の以下の箇所です。「io.read_point_cloud() 関数」を用いて読み込みたい点群データのファイルパスを指定することで、点群データの読み込みが可能です。
また、Windowに点群の表示を行っているのが以下の15行目の箇所となります。「o3d.visualization.draw_geometries() 関数」に点群データを渡すことで、点群データの表示を行うことができます。
正常に読込と表示が行えると、以下のようにウインドウに点群が表示されます。左クリックしながらマウスを動かすことで視点を変えることもできます。
今回は色無し点群を読み込んでいますが、この場合は表示時に自動で色が付くようです。
以下はDragonの点群を表示した結果です。
また、今回は何も点群データの中身を弄っていないので、入力と同じデータが出力されるだけですが、何かの処理を行った後に点群を出力する場合には、以下のように「io.write_point_cloud() 関数」を使って点を保存することができます。
Open3Dを利用することで、Pythonで簡単に点群を読み込むことができます。
Open3Dでは、読み込んだ点群に対して以下のような処理を行う関数が既に実装されていますので、さらに数行追加するだけで高度な点群処理を簡易に実現することが可能になります。
本ブログでも、既にいくつか高度な点群処理に関する記事を紹介していますので、是非参考にしてみてください。