【Pythonライブラリ】「open3d」のサンプルコード

Python

こちらは「open3d」(Pythonライブラリ)のサンプルコードについての記事となっております。

その他、3Dモデルの処理方法についての情報は下記の記事で紹介しております。
open3d/plotly/trimesh/pyvista/vedo/pytorch3d/matplotlibといったPythonライブラリや3DツールのPythonAPIであるbpy(Blender)/unreal(Unreal Engine)といったPythonライブラリについて気になる方はこちらの記事をご覧ください。

基本情報 … Basic Information

「Open3D」は、Pythonで書かれたオープンソースの3Dデータ処理ライブラリです。主に点群や三角形メッシュなどの3Dデータの可視化、前処理、解析に用いられます。このライブラリを用いることで、3Dデータを簡単に取り扱うことができます。

具体的には、点群やメッシュを読み込んで可視化することができます。また、3Dデータの前処理として、フィルタリング、平面検出、バウンディングボックスの計算、ノーマルベクトルの計算、メッシュの簡素化などの処理を提供します。その他にも、3Dデータの変換、変形、重ね合わせ、ICP(Iterative Closest Point)による点群のレジストレーションなどの機能も備えています。

サンプルコード … Sample Code

001 メッシュモデルの読み込み、メッシュモデルから点群モデルへの変換、メッシュモデルの保存、点群モデルの保存

Read the Mesh Model, Convert the Mesh Model to Point Cloud Model, Save the Mesh Model, Save the Point Cloud Model

import open3d as o3d

# メッシュモデルの読み込む
mesh = o3d.io.read_triangle_mesh("SAMPLE/monkeyTri.obj")

# メッシュモデルの書き出し/保存
o3d.io.write_triangle_mesh("SAMPLE/monkeyTriCopy.obj", mesh)
o3d.io.write_triangle_mesh("SAMPLE/monkeyTriCopy.ply", mesh)
o3d.io.write_triangle_mesh("SAMPLE/monkeyTriCopy.stl", mesh)

# メッシュモデルから点群モデルへの変換
vertices = mesh.vertices
pcd = o3d.geometry.PointCloud()
pcd.points = vertices

# 点群モデルの書き出し/保存
o3d.io.write_point_cloud("SAMPLE/monkeyTriConv.pcd", pcd)
o3d.io.write_point_cloud("SAMPLE/monkeyTriConv.ply", pcd)
o3d.io.write_point_cloud("SAMPLE/monkeyTriConv.xyz", pcd)
o3d.io.write_point_cloud("SAMPLE/monkeyTriConv.pts", pcd)

このPythonプログラムは、open3dライブラリを使用して、3Dメッシュモデルから点群モデルへの変換を行います。最初に、”SAMPLE/monkeyTri.obj”というファイルから3Dメッシュモデルを読み込みます。次に、3Dメッシュモデルをファイル形式で書き出し、”SAMPLE/monkeyTriCopy.obj”、”SAMPLE/monkeyTriCopy.ply”、”SAMPLE/monkeyTriCopy.stl”として保存します。その後、メッシュモデルから点群モデルへの変換を行い、”pcd”という変数に格納します。最後に、点群モデルをファイル形式で書き出し、”SAMPLE/monkeyTriConv.pcd”、”SAMPLE/monkeyTriConv.ply”、”SAMPLE/monkeyTriConv.xyz”、”SAMPLE/monkeyTriConv.pts”として保存します。

002 メッシュモデルの読み込み(形式:obj)、メッシュモデルの表示

import open3d as o3d

# メッシュモデルの読み込む
mesh = o3d.io.read_triangle_mesh("SAMPLE/monkeyTri.obj")

# 頂点法線の計算及び適用
mesh.compute_vertex_normals()

# メッシュモデルを表示する
o3d.visualization.draw_geometries([mesh])

このPythonプログラムは、Open3Dを使用して3Dメッシュモデルを読み込んで表示するものです。プログラムは、指定されたファイル(ここでは”monkeyTri.obj”)からメッシュデータを読み込み、頂点法線を計算して適用します。最後に、Open3Dのビジュアライゼーション機能を使用して、メッシュモデルを表示します。

003 メッシュモデルの読み込み(形式:ply)、メッシュモデルの表示

import open3d as o3d

# メッシュモデルの読み込む
mesh = o3d.io.read_triangle_mesh("SAMPLE/monkeyTriCopy.ply")

# 頂点法線の計算及び適用
mesh.compute_vertex_normals()

# メッシュモデルを表示する
o3d.visualization.draw_geometries([mesh])

このPythonコードは、3Dメッシュモデルを読み込んで頂点法線を計算し、表示するものです。open3dライブラリを使用して、PLYファイル形式のメッシュモデルを読み込みます。メッシュモデルを表示する前に、compute_vertex_normals()関数を使用して頂点法線を計算し、メッシュに適用します。最後に、draw_geometries()関数を使用して、メッシュモデルを表示します。

004 メッシュモデルの読み込み(形式:stl)、メッシュモデルの表示

import open3d as o3d

# メッシュモデルの読み込む
mesh = o3d.io.read_triangle_mesh("SAMPLE/monkeyTriCopy.stl")

# 頂点法線の計算及び適用
mesh.compute_vertex_normals()

# メッシュモデルを表示する
o3d.visualization.draw_geometries([mesh])

このPythonプログラムは、Open3Dライブラリを使用して3Dメッシュモデルを読み込み、頂点法線を計算して表示します。まず、”mesh”変数にSTLファイルから三角形メッシュを読み込みます。次に、compute_vertex_normals()関数を使用して、頂点法線を計算し、メッシュに適用します。最後に、draw_geometries()関数を使用して、メッシュを表示します。

005 点群モデルの読み込み(形式:pcd)、点群モデルの表示

import open3d as o3d

# 点群モデルの読み込む
pcd = o3d.io.read_point_cloud("SAMPLE/monkeyTriConv.pcd")

# 点群モデルを表示する
o3d.visualization.draw_geometries([pcd])

このPythonプログラムは、Open3Dライブラリを使用して点群モデルを読み込み、表示するものです。最初に、read_point_cloud関数を使用してmonkeyTriConv.pcdファイルから点群モデルを読み込みます。次に、draw_geometries関数を使用して点群モデルを表示します。このプログラムは、3Dポイントクラウドデータを視覚化するために使用できます。

006 点群モデルの読み込み(形式:ply)、点群モデルの表示

import open3d as o3d

# 点群モデルの読み込む
pcd = o3d.io.read_point_cloud("SAMPLE/monkeyTriConv.ply")

# 点群モデルを表示する
o3d.visualization.draw_geometries([pcd])

上記のPythonプログラムは、Open3Dを使用して点群モデルを読み込み、表示するためのものです。まず、open3dをインポートし、read_point_cloud関数を使用してPLYファイルから点群モデルを読み込みます。次に、draw_geometries関数を使用して点群モデルを表示します。

007 点群モデルの読み込み(形式:xyz)、点群モデルの表示

import open3d as o3d

# 点群モデルの読み込む
pcd = o3d.io.read_point_cloud("SAMPLE/monkeyTriConv.xyz")

# 点群モデルを表示する
o3d.visualization.draw_geometries([pcd])

上記のPythonプログラムは、Open3Dライブラリを使用して、点群データを読み込み、3Dビューアーに表示するものです。プログラムの中で、最初に点群データを読み込み、次にdraw_geometries関数を使用して、点群を表示します。

008 点群モデルの読み込み(形式:pts)、点群モデルの表示

import open3d as o3d

# 点群モデルの読み込む
pcd = o3d.io.read_point_cloud("SAMPLE/monkeyTriConv.pts")

# 点群モデルを表示する
o3d.visualization.draw_geometries([pcd])

上記Pythonプログラムは、Open3Dライブラリを使用して3D点群データを読み込み、表示するためのものです。最初に、”monkeyTriConv.pts”というファイル名の点群データを読み込みます。次に、読み込んだ点群データを表示するために、o3d.visualization.draw_geometries()関数を使用します。この関数は、引数として一つ以上の点群データを受け取り、それらを3Dビューワーで表示します。

009 メッシュモデルの頂点情報の表示

import open3d as o3d
import numpy as np

# メッシュモデルの読み込む
mesh = o3d.io.read_triangle_mesh("SAMPLE/monkeyTri.obj")

# メッシュモデルの頂点情報の表示
vertices = mesh.vertices
print(f"Vertices Information:")
print(np.asarray(vertices))

このPythonプログラムは、Open3Dを使用して3Dメッシュモデルの頂点情報を読み込み、表示するものです。mesh変数には、read_triangle_mesh()メソッドを使用して、OBJファイルからメッシュモデルを読み込みます。次に、vertices変数には、meshオブジェクトのvertices属性を使用して、メッシュモデルの頂点情報が格納されます。最後に、np.asarray()関数を使用して、頂点情報をNumPy配列に変換し、表示されます。

頂点情報の表示

Vertices Information:
[[ 0.46875     0.24218801  0.75781202]
 [ 0.5         0.09375     0.6875    ]
 [ 0.5625      0.24218801  0.671875  ]
 …
 [ 0.         -0.1875      0.796875  ]
 [ 0.         -0.140625    0.74218798]
 [ 0.         -0.19531199  0.75      ]]
Vertices Number: 2865

010 メッシュモデルの面情報の表示

import open3d as o3d
import numpy as np

# メッシュモデルの読み込む
mesh = o3d.io.read_triangle_mesh("SAMPLE/monkeyTri.obj")

# メッシュモデルの面情報の表示
faces = mesh.triangles
print(f"Faces Information:")
print(np.asarray(faces))
print(f"Faces Number: {len(faces)}")

このPythonプログラムは、Open3Dライブラリを使用して、3Dメッシュモデルを読み込み、その面情報を表示します。プログラムは、まず、o3d.io.read_triangle_meshを使用して、メッシュファイルを読み込みます。次に、mesh.trianglesを使用して、メッシュの面情報を取得し、np.asarrayを使用してNumPy配列に変換します。最後に、配列の長さを表示して、メッシュの面の数を確認します。

面情報の表示

Faces Information:
[[   0    1    2]
 [   3    4    5]
 [   6    7    8]
 …
 [1426 1427 1428]
 [1429 1430 1431]
 [1432 1433 1434]]
Faces Number: 7729

011 点群モデルの頂点情報の表示

import open3d as o3d
import numpy as np

# 点群モデルの読み込み
pcd = o3d.io.read_point_cloud("SAMPLE/monkeyTriConv.pcd")

# 点群モデルの頂点情報の表示
points = pcd.points
print(f"Points Information:")
print(np.asarray(points))
print(f"Points Number: {len(points)}")

このPythonプログラムは、Open3Dを使用して点群モデルを読み込み、その頂点情報を表示するものです。最初に、read_point_cloud関数を使用して、.pcdファイルから点群データを読み込みます。次に、点群データから頂点情報を取得し、np.asarray関数を使用してNumPy配列に変換します。最後に、頂点座標を表示し、点の数を出力します。

頂点情報の表示

Points Information:
[[ 0.46875 0.24218801 0.75781202]
[ 0.5 0.09375 0.6875 ]
[ 0.5625 0.24218801 0.671875 ]

[ 0. -0.1875 0.796875 ]
[ 0. -0.140625 0.74218798]
[ 0. -0.19531199 0.75 ]]
Points Number: 2865

ETC

### Public Library ############################################################

import open3d as o3d
import numpy as np

###############################################################################

obj = o3d.io.read_triangle_mesh('SAMPLE/monkeyTri.obj')

print(np.asarray(obj.vertices))
### [[ 0.46875     0.24218801  0.75781202]
###  [ 0.5         0.09375     0.6875    ]
###  [ 0.5625      0.24218801  0.671875  ]
###  ...
###  [ 0.         -0.1875      0.796875  ]
###  [ 0.         -0.140625    0.74218798]
###  [ 0.         -0.19531199  0.75      ]]

print(np.asarray(obj.vertex_colors))
### []

print(np.asarray(obj.vertex_normals))
### [[ 0.66170001 -0.2026      0.72189999]
###  [ 0.66170001 -0.2026      0.72189999]
###  [ 0.66170001 -0.2026      0.72189999]
###  ...
###  [-1.          0.          0.        ]
###  [-1.          0.          0.        ]
###  [-1.          0.          0.        ]]

print(np.asarray(obj.triangles))
### [[   0    1    2]
###  [   3    4    5]
###  [   6    7    8]
###  ...
###  [1426 1427 1428]
###  [1429 1430 1431]
###  [1432 1433 1434]]

print(np.asarray(obj.triangle_uvs))
### [[0.89095497 0.59006298]
###  [0.86008102 0.56011498]
###  [0.904571   0.55940402]
###  ...
###  [0.39103901 0.61189097]
###  [0.498072   0.552315  ]
###  [0.48406801 0.62877601]]

print(np.asarray(obj.triangle_normals))
### []

print(np.asarray(obj.triangle_material_ids))
### [1 1 1 ... 1 1 1]

print(obj.has_vertices())                   ### True
print(obj.has_vertex_colors())              ### False
print(obj.has_vertex_normals())             ### True

print(obj.has_triangles())                  ### True
print(obj.has_triangle_uvs())               ### True
print(obj.has_triangle_normals())           ### False
print(obj.has_triangle_material_ids())      ### True

###############################################################################

obj.compute_vertex_normals()
o3d.visualization.draw_geometries([obj])

###############################################################################

上記のプログラムを用いて、3Dモデルを読み込み、頂点座標、法線、三角形インデックス、UV座標などを取得することができます。

  • o3d.io.read_triangle_mesh('file.obj')file.objから3Dモデルを読み込み、Open3DのTriangleMeshデータ構造に変換します。
  • np.asarray(obj.vertices):3Dモデルの頂点座標をNumPy配列として取得します。
  • np.asarray(obj.vertex_normals):3Dモデルの頂点法線をNumPy配列として取得します。
  • np.asarray(obj.triangles):3Dモデルの三角形インデックスをNumPy配列として取得します。
  • np.asarray(obj.triangle_uvs):3Dモデルの三角形のUV座標をNumPy配列として取得します。
  • np.asarray(obj.triangle_material_ids):3Dモデルの三角形のマテリアルIDをNumPy配列として取得します。
  • obj.compute_vertex_normals():3Dモデルの頂点法線を計算します。
  • o3d.visualization.draw_geometries([obj]):3Dモデルを可視化します。

サンプル出力画像1

参考リンク … Reference Link