本記事では、Open3Dによるメッシュデータの生成や表示について解説する。
記述内容は以下です。
- plyファイルの読み込みと点群情報の取得
- ダウンサンプリング
- メッシュデータの作成:準備としての法線推定も含む
- 低密度の領域を削除
- メッシュデータの表示
また、本記事の作成にあたり、以下の書籍が非常に参考になりましたので良ければご参考に。
リンク
実行環境
本記事の実行環境です
- OS:Windows 10
- Python Ver.3.11
- Open3d Ver.0.18.0
インストールはこちらを参考にしました。
処理対象となる点群およびテキスチャ情報
処理対象は、RealSenseにより取得した点群およびテキスチャ情報です。
以下のRealSenseの箱とマウスの情報を、Ply形式で保存しています。
メッシュデータの生成方法
サンプルコード
以下の処理するプログラムを作成する。
- plyファイルの読み込みと点群情報の取得
- ダウンサンプリング
- メッシュデータの作成:準備としての法線推定も含む
- 低密度の領域を削除
- メッシュデータの表示
以下サンプルコードである。
import open3d as o3d
# PLYファイルの読み込み
file_path = "realsensebox.ply" # 適切なパスに変更してください
point_cloud = o3d.io.read_point_cloud(file_path)
print("点群情報を読み込みました。")
print(point_cloud)
# 点群を表示
o3d.visualization.draw_geometries([point_cloud], window_name="Original Point Cloud")
# ダウンサンプリング
voxel_size = 0.01 # ボクセルサイズを設定
downsampled_cloud = point_cloud.voxel_down_sample(voxel_size=voxel_size)
print("ダウンサンプリング後の点群サイズ:", len(downsampled_cloud.points))
# ダウンサンプリングした点群を表示
o3d.visualization.draw_geometries([downsampled_cloud], window_name="Downsampled Point Cloud")
# メッシュデータの作成
# 法線推定
downsampled_cloud.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
# メッシュデータ生成
mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(downsampled_cloud, depth=9)
print("メッシュデータを作成しました。")
# 低密度の領域を削除(オプション)
bbox = downsampled_cloud.get_axis_aligned_bounding_box()
mesh = mesh.crop(bbox)
#メッシュデータの表示
o3d.visualization.draw_geometries([mesh], window_name="Mesh Data")
サンプルコードの深堀
# PLYファイルの読み込み
file_path = "realsensebox.ply" # 適切なパスに変更してください
point_cloud = o3d.io.read_point_cloud(file_path)
print("点群情報を読み込みました。")
print(point_cloud)
# 点群を表示
o3d.visualization.draw_geometries([point_cloud], window_name="Original Point Cloud")
ここでは、plyファイルの読み込みと点群情報の取得・表示を実行している。結果は以下。
# ダウンサンプリング
voxel_size = 0.01 # ボクセルサイズを設定
downsampled_cloud = point_cloud.voxel_down_sample(voxel_size=voxel_size)
print("ダウンサンプリング後の点群サイズ:", len(downsampled_cloud.points))
# ダウンサンプリングした点群を表示
o3d.visualization.draw_geometries([downsampled_cloud], window_name="Downsampled Point Cloud")
ここでは、ダウンサンプリング処理を実行している。
voxel_down_sampleの引数としてvoxel_size = 0.01[mm]として用いている。
# メッシュデータの作成
# 法線推定
downsampled_cloud.estimate_normals()
# メッシュデータ生成
mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(downsampled_cloud)
print("メッシュデータを作成しました。")
- downsampled_cloud.estimate_normals()
法線推定を実行する。後述のメッシュデータ生成に必要となる - o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd)
点群情報からメッシュデータの生成を実行する。- 引数
- pcd:は点群情報と法線情報が含まれている必要がある。
- その他引数についてはドキュメントを参照
- 戻り値:Tuple[open3d.geometry.TriangleMesh, open3d.utility.DoubleVector]
- 引数
# 低密度の領域を削除
bbox = downsampled_cloud.get_axis_aligned_bounding_box()
mesh = mesh.crop(bbox)
#メッシュデータの表示
o3d.visualization.draw_geometries([mesh], window_name="Mesh Data")
- open3d.geometry.TriangleMesh.get_axis_aligned_bounding_box()
バウンディングボックス(オブジェクトの周囲を囲む境界線)を生成する
戻り値:open3d.geometry.AxisAlignedBoundingBox - open3d.geometry.TriangleMesh.crop
引数で指定したバウンディングボックスに従って、メッシュデータの切り出し(crop)を実行する - o3d.visualization.draw_geometries([mesh], window_name=”Mesh Data”)
メッシュデータを表示する。実行結果は以下。
まとめ
本記事では、plyファイルから点群情報を抜き出しメッシュデータを生成・表示する手順をした。
本記事の作成にあたり、以下の書籍が非常に参考になりましたので良ければご参考に。
リンク