PLYファイル(点群/メッシュ)をPythonで読み込む方法

3D点群やメッシュのファイル形式としてPLYファイルがよく使用されます。今回は、このPLYファイルをPythonで読み込む方法を紹介します。

私はPytorchを利用してグラフニューラルネットワークベースの3D点群処理を行いたいという背景から、Pythonで簡単に点群のPLYファイルを読み込める方法を探していました。

今回はplyfileモジュールを用いたPLYファイルの読み込み方法を紹介します。

plyfile pythonモジュールのインストール

今回紹介するplyfile pythonモジュールは、ASCII ファイルとバイナリ PLY ファイルを読み書きするための簡単な機能を提供します。pipを利用して以下のコマンドでインストールできます。

pip install plyfile

plyfileの読み込み方法、ソースコード

読み込みはimportを除けば、たった1行で実現できます。下記コードの‘longdress_vox10_1051.ply’のところに読み込みたいPLYファイルのパスを記述してください。

import numpy as np
from plyfile import PlyData

# Loading PLY data
plydata = PlyData.read('longdress_vox10_1051.ply')

もし同じデータでテストしたい場合にはJPEG Pleno Database: 8i Voxelized Full Bodies (8iVFB v2)からデータをダウンロードできます。

以下のようにprintすると、PLYファイルの中身を知ることができます。今回使用したデータセットは、面などは持たない点のみのデータセットのためelementはvertex(頂点)のみです。また、各頂点は6つ(x, y, z, red, green, blue)のpropertyを持ちます。

print(plydata)

データの参照方法

点群の持つ各属性(頂点、色……)は、numpyの配列として取得することができます。頂点や色の情報を獲得するにはどうすればよいでしょうか。

例えば以下のような記述でposdataに全ての点の座標値を、colordataの全ての点の色の値をnumpyの配列として得ることができます。

import numpy as np
from plyfile import PlyData

# Loading PLY data
plydata = PlyData.read('longdress_vox10_1051.ply')

# Getting position and color
vertices = plydata['vertex'];
posdata = np.vstack([vertices['x'], vertices['y'], vertices['z']]).T
colordata = np.vstack([vertices['red'], vertices['green'], vertices['blue']]).T
print(posdata) 
print(colordata) 

Haruoka