Python|点群(E57ファイル)を表示する。

  • 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」にそれぞれ格納していきます。

やり方はこちらの記事を参考にさせていただきました。

Open3Dの点群を切り出す

注意点として、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」は比較的メジャーで、表示する以外にも、点群を様々に加工することができます。点群を使って何かやってみたいなと思ったら、真っ先に使うべきライブラリだと思います。

Pythonの点群・3Dメッシュ可視化ライブラリが多すぎてカオスなので整理してみる - Qiita
最近Pythonで2次元/3次元問わずデータ処理を行うことが多いんですが、特に3次元データの方のライブラリが色々ありすぎて頭の処理が追いつかないのでちょっとだけ整理していこうと思います。(随時更新…

コメント

タイトルとURLをコピーしました