- Python + Open3DでE57の点群データを表示
- 有料ソフトは不要で点群データを閲覧
点群とはその名の通り、点が集まっているような見た目のデータです。
今は、土木業界で少し広まり始めた程度ですが、近い将来、「画像データ」や「音声データ」などと並んで、点群データ一般的に利用されるようになることでしょう。
点群データは、さまざまなファイル形式があります。
その中で「E57」というファイル形式は互換性が高く、さまざまなソフトで扱うことができます。
この記事では、E57データをpython使って画面に表示する方法を紹介します。
環境
- windows10
- Visual Studio Code
恐らくMacでも動作はするとは思います。
GoogleColaboratoryは無理でした。
必要なライブラリ
下記のライブラリを利用します。
- PyE57
- Open3D
両方とも標準ライブラリではないので、前もってインストールしておきます。
pipで簡単にインストールすることができます。
(env) PS C:\python> pip install pye57
(env) PS C:\python> pip install open3d
完成コード
こちらが完成コードです。
# ==================================================================
# E57ファイルを表示する簡単なテスト
# ==================================================================
# ==================================================================
# 1.必要なライブラリのインポート
# ==================================================================
import open3d as o3d
import pye57
#===============================================================
# 2.E57ファイルの読み込み
#===============================================================
e57 = pye57.E57("pumpACartesian.e57")
#===============================================================
# 3.E57ファイルをリストに格納
#===============================================================
data = e57.read_scan(0, intensity=True, colors=True, row_column=True, ignore_missing_fields = True)
#===============================================================
# 4.リストをPoint_cloud_dataに格納できるように加工
#===============================================================
points = []
colors = []
Points_count = len(data["cartesianX"])
for i in range(1, Points_count, 1):
x = data["cartesianX"][i]
y = data["cartesianY"][i]
z = data["cartesianZ"][i]
red = data["colorRed"][i] / 100
green = data["colorGreen"][i] / 100
blue = data["colorBlue"][i] / 100
points.append([x,y,z])
colors.append([red, green, blue])
#===============================================================
#5.加工したリストをpoint_cloud_dataとして格納
#===============================================================
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
pcd.colors = o3d.utility.Vector3dVector(colors)
#===============================================================
#6.point_cloud_dataの表示
#===============================================================
o3d.visualization.draw_geometries([pcd])
コード解説
必要なライブラリのインポート
import open3d as o3d
import pye57
一番最初に必要なライブラリをインストールしています。Open3dは、毎回打つには長いので、「o3d」としています。
E57ファイルの読み込み
e57 = pye57.E57("pumpACartesian.e57")
ファイルを読み込みます。
Pythonでは、スクリプトと同じ階層にファイルがある場合は、パスは省略しても読み込めます。
手元にe57データがないけど、試してみたい!という方はサンプルデータがあります。
サンプルデータはこちら
E57ファイルをリストに格納
data = e57.read_scan(0, intensity=True, colors=True, row_column=True, ignore_missing_fields = True)
E57ファイルを読み込んだままだと、Open3dで扱うことができません。
読み込んだデータをリストに格納します。
筆者の環境では、pye57の公式ドキュメントに書かれている通りだとエラーが出ました。
引数に「ignore_missing_fields = True」とするとエラーが出なくなったので、上記の書き方にしています。
リストをPoint_cloud_dataに加工
points = []
colors = []
Points_count = len(data["cartesianX"])
for i in range(1, Points_count, 1):
x = data["cartesianX"][i]
y = data["cartesianY"][i]
z = data["cartesianZ"][i]
red = data["colorRed"][i] / 100
green = data["colorGreen"][i] / 100
blue = data["colorBlue"][i] / 100
points.append([x,y,z])
colors.append([red, green, blue])
読み込んだリストを加工していきます。
Points_count = len(data[“cartesianX”]) で点群の数をカウントして、点群の数だけループを行います。
この例では、画面に表示するのが目的なので、点群の「x,y,z」と「R,G,B」値を抽出し、「points
」と「colors」にそれぞれ格納していきます。
やり方はこちらの記事を参考にさせていただきました。
注意点として、E57のRGB値は0~100ですが、point-cloud-dataは0~1のようなので、割る100をしてから格納しています。
加工したリストをpoint_cloud_dataとして格納
#===============================================================
#5.表示の下処理
#===============================================================
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
pcd.colors = o3d.utility.Vector3dVector(colors)
加工したリストをpoint_cloud_dataとして格納しています。こちらも上記の記事を参考としています。
open3dで画面表示を行うには、point_cloud_dataというデータフォーマットに格納する必要があります。
表示
o3d.visualization.draw_geometries([pcd])
表示はこの一行だけで実行できます。
成功すると、vscodeとは別ウィンドウで点群データが表示されます。
Pythonでopen3dを使うということ。
下記の記事に紹介されているように、pythonで点群データを扱うライブラリは数多くあります。その中で、今回点群を表示するために使った「open3d」は比較的メジャーで、表示する以外にも、点群を様々に加工することができます。点群を使って何かやってみたいなと思ったら、真っ先に使うべきライブラリだと思います。
コメント