OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
点群の可視化

原著者Dmitrii Klepikov
互換性OpenCV >= 5.0

目的

このチュートリアルでは次のことを行う:

  • 点群データの読み込みと保存
  • データの可視化

必要条件

可視化を行うには、OpenGLサポートを有効にしてOpenCVライブラリをコンパイルする必要がある。そのためには、OpenCVをソースからビルドする際に、CMakeでWITH_OPENGLフラグをONに設定する必要がある。

実践

点群の読み込みと保存は、それぞれcv::loadPointCloudcv::savePointCloudを使って行える。

現在サポートされている形式は次のとおりである:

  • .OBJ(サポートされているキーは、点の位置を表すv、法線座標のvn、メッシュの面のfであり、その他のキーは無視される)
  • .PLY(すべてのエンコード形式(asciiおよびbyte)がサポートされているが、データの型はfloatのみという制限がある)
vertices, normals = cv2.loadPointCloud("teapot.obj")

関数cv::loadPointCloudは、float型の点のベクトル(cv::Point3f)と、その法線のベクトル(ソースファイルで指定されている場合)を返す。これを可視化するにはviz3dモジュールの関数を利用できるが、そのためにはデータを別の形式に再解釈する必要がある。

vertices = np.squeeze(vertices, axis=1)
color = [1.0, 1.0, 0.0]
colors = np.tile(color, (vertices.shape[0], 1))
obj_pts = np.concatenate((vertices, colors), axis=1).astype(np.float32)
cv2.viz3d.showPoints("Window", "Points", obj_pts)
cv2.waitKey(0)

次のコードサンプルでは、各点に色属性を追加している。結果は次のようになる:

追加情報として、グリッドを加えることもできる

vertices, normals = cv2.loadPointCloud("teapot.obj")

3Dオブジェクトを描画する別の方法としてメッシュがある。そのために、メッシュデータを読み込んで表示する専用の関数を使用する。ここでは現時点で.OBJファイルのみがサポートされており、処理の前に三角形分割しておく必要がある(三角形分割とは、面を三角形に分割する処理のこと)。

vertices, indices = cv2.loadMesh("../data/teapot.obj")
vertices = np.squeeze(vertices, axis=1)
cv2.viz3d.showMesh("window", "mesh", vertices, indices)