Open3Dによるメッシュデータの生成と表示

画像処理および三次元物体認識

本記事では、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”)
    メッシュデータを表示する。実行結果は以下。
補足:crop関数を実行しないとどうなるのか?

crop関数をコメントアウトしてメッシュデータを表示すると、右図のようになる。

必要のない周辺領域がつながってしまいますので、必要なければcrop関数の利用をしたほうが無難そう。

まとめ

本記事では、plyファイルから点群情報を抜き出しメッシュデータを生成・表示する手順をした。

本記事の作成にあたり、以下の書籍が非常に参考になりましたので良ければご参考に。

参考資料

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