.ply形式で保存した点群・テキスチャデータをPythonとOpen3dで表示する

はじめに

本記事は、.ply形式で保存した点群・テキスチャ情報をOpen3dを使用して表示する方法を説明します。
使用するplyファイルは、下記の記事のサンプルコードにて保存したデータです。


私の学習を兼ねてサンプルコードを少し深堀して書きますので参考にどうぞ。

実行環境

本記事の実行環境です

  • OS:Windows 10
  • Python Ver.3.11
  • Open3d Ver.0.18.0
    インストールはこちらを参考にしました。

ply形式で保存した点群情報を表示するコード

この節では以下3種類のコードを説明し、表示データを比較します。

  • plyファイルデータを無処理でメッシュデータを表示する
  • 頂点法線の計算結果を適用したメッシュデータを表示する
  • メッシュデータから変換した点群データを表示する

plyファイルデータを無処理で表示する

import open3d as o3d

print(o3d.io.read_file_geometry_type('1.ply'))
# →表示結果:FileGeometry.CONTAINS_TRIANGLES
mesh = o3d.io.read_triangle_mesh("1.ply")
# メッシュモデルを表示する
o3d.visualization.draw_geometries([mesh])
  • o3d.io.read_file_geometry_type(‘1.ply’)
    引数で指定したファイルのジオメトリタイプopen3d.io.FileGeometryを戻り値として返す関数です。表示結果は「FileGeometry.CONTAINS_TRIANGLES」となりますので、ファイルにメッシュデータが格納されていることがわかります。
  • mesh = o3d.io.read_triangle_mesh(“1.ply”)
    引数で指定したファイルからメッシュデータを読み込みます。戻り値open3d.geometry.TriangleMeshがmeshにインスタンス化されます。
  • o3d.visualization.draw_geometries([mesh])
    メッシュデータを表示します。
    ・・・C++で記述するPCLと比較すると簡単すぎて涙がでます・・・

以下が、表示されたメッシュデータです。

頂点法線の計算結果を適用したメッシュデータを表示する

import open3d as o3d

print(o3d.io.read_file_geometry_type('1.ply'))
mesh = o3d.io.read_triangle_mesh("1.ply")
# 頂点法線の計算及び適用
mesh.compute_vertex_normals()
# メッシュモデルを表示する
o3d.visualization.draw_geometries([mesh])

mesh.compute_vertex_normals()
前述したコードとの差異はここだけです。open3d.geometry.TriangleMeshクラスのcompute_vertex_normalsメソッドを実行し、頂点法線を計算します。

以下が、上記実行し表示されたメッシュデータです。

メッシュデータから変換した点群データを表示する

import open3d as o3d

print(o3d.io.read_file_geometry_type('1.ply'))
mesh = o3d.io.read_triangle_mesh("1.ply")
# メッシュモデルから点群モデルへの変換
vertices = mesh.vertices
pcd = o3d.geometry.PointCloud()
pcd.points = vertices
o3d.visualization.draw_geometries([pcd])
  • vertices = mesh.vertices
    open3d.geometry.TriangleMeshクラスのverticesプロパティをverticesとしてインスタンス化します。頂点座標を表しているようです。float64 形状の配列です。データアクセスのためにnumpy.asarray()を使用しているそうです。
  • pcd = o3d.geometry.PointCloud()
    open3d.geometry.PointCloudクラスをpcdオブジェクトとしてインスタンス化します。
  • pcd.points = vertices
    頂点座標が格納されているverticesをpcd.pointsに代入します。pointプロパティはfloat64 形状の配列(num_points, 3)で、データアクセスのためにnumpy.asarray()を使用しているため、verticesプロパティと型が一致します。
  • o3d.visualization.draw_geometries([pcd])
    点群データを表示します。

以下は、上記のコードを実行した際表示された点群データです。

まとめ

本記事では、.ply形式で保存した点群・テキスチャ情報をOpen3dを使用して表示する方法を説明しました。今後は、本格的に特定物体の認識に向けてチャレンジしていきたいと思います。

参考

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