Categories: open3d

Open3Dで3D点群(PLYファイル)を読み込んで表示を行うプログラム(Open3DとPythonによる実装)

3D点群処理ができる手軽なPythonのライブラリとして「Open3D」があります。

今回はOpen3Dを用いて、以下を実現できるプログラムを紹介します。

  1. 3D点群の汎用フォーマットであるPLYファイルを入力に、3D点群データを読み込む
  2. 読み込んだ点群をウィンドウに表示する

Open3Dの環境構築に関しては、以前に環境構築の方法を紹介しておりますので、以下の記事を参照してみてください。今回はOpen3Dは環境構築済の状態で始めたいと思います。

今回は3Dデータ処理のためにOpen3Dの環境構築をしてみたいと思います。 このOpen3DはIntel Labsから2018年に論...

また、3D点群ではなく、ポリゴンを読み込む方法は以下の記事でまとめておりますので、点群ではなくポリゴンを読み込みたい方は以下の記事を参考にしてみてください。

3Dデータ処理ができる手軽なライブラリとして、Open3Dがあります。 本日はこのOpen3Dを用いて、3Dメッシュ(ポリゴン)の汎...

PLYファイルフォーマットの形式

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ファイルは様々なサイトで提供されていますが、点数が多くなるにつれ、データサイズも膨大になります。データサイズが大きすぎるとダウンロードに時間が掛かったり、ストレージの容量を圧迫したり、表示に時間が掛かるなど都合が悪いことが多いと思います。

そのため、今回は比較的シンプルな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で表示してみましょう。

プログラムの紹介

今回の動作環境

  • OS:Windows 10
  • Python 3.6.10
  • Open3D ver. 0.10.0.1

ソースコード

コードの解説

点群の読込

点群の読み込みに必要なのは8行目の以下の箇所です。「io.read_point_cloud() 関数」を用いて読み込みたい点群データのファイルパスを指定することで、点群データの読み込みが可能です。

点群の表示

また、Windowに点群の表示を行っているのが以下の15行目の箇所となります。「o3d.visualization.draw_geometries() 関数」に点群データを渡すことで、点群データの表示を行うことができます。

正常に読込と表示が行えると、以下のようにウインドウに点群が表示されます。左クリックしながらマウスを動かすことで視点を変えることもできます。

今回は色無し点群を読み込んでいますが、この場合は表示時に自動で色が付くようです。

以下はDragonの点群を表示した結果です。

点群の保存

また、今回は何も点群データの中身を弄っていないので、入力と同じデータが出力されるだけですが、何かの処理を行った後に点群を出力する場合には、以下のように「io.write_point_cloud() 関数」を使って点を保存することができます。

まとめ

Open3Dを利用することで、Pythonで簡単に点群を読み込むことができます。

Open3Dでは、読み込んだ点群に対して以下のような処理を行う関数が既に実装されていますので、さらに数行追加するだけで高度な点群処理を簡易に実現することが可能になります。

  • 点の法線ベクトルの計算
  • 点の間引き(ダウンサンプリング)
  • 点群からポリゴンを計算(面の構築)

本ブログでも、既にいくつか高度な点群処理に関する記事を紹介していますので、是非参考にしてみてください。

本日はOpen3Dを用いて、3D点群の法線ベクトルを計算するプログラムを紹介したいと思います。 Open3Dの環境構築の関しては、以...
本日はOpen3Dを用いて、3D点群のダウンサンプリングを行うプログラムを紹介したいと思います。 ダウンサンプリングとは、入力された...
本日はOpen3Dを用いて、3D点群データから面を推定し、メッシュ(ポリゴン)データに変換するプログラムを紹介します。 Open3D...
Haruoka