RGBDImageからPointCloudへの変換(Open3D)

Open3Dでopen3d::geometry::RGBDImageから点群データ(Point Cloud)を生成する方法について紹介する。Open3Dでは点群データはopen3d::geometry::PointCloudで取り扱うことができる。RGBDImageからPointCloudへの変換は以下のように書ける。
auto pcd = open3d::geometry::PointCloud::CreateFromRGBDImage(
      rgbd_img, camera_intrinsics);
ここで、camera_intrinsics_はカメラ内部パラメータの情報で、以下のような感じで設定できる。
camera_intrinsics = open3d::camera::PinholeCameraIntrinsic(
        image_width, image_height, fx, fy, cx, cy);
また、ポイントクラウド同士の統合や変換行列の適用も以下のように簡単に行える。extrinsic_mat1, extrinsic_mat2はそれぞれカメラ外部パラメータ行列(Eigen::Matrix4d)となっている。
  auto pcd1 = open3d::geometry::PointCloud::CreateFromRGBDImage(
      rgbd_img1, camera_intrinsics_);
  auto pcd2 = open3d::geometry::PointCloud::CreateFromRGBDImage(
      rgbd_img2, camera_intrinsics_);

  pcd1->Transform(extrinsic_mat1); // World座標へ変換
  pcd2->Transform(extrinsic_mat2); // World座標へ変換
  *pcd1 += *pcd2; // pcd1にpcd2を追加
以下はTUM RGB-D Datasetのカメラ位置姿勢の真値を使って、各視点から得られるポイントクラウドを一つの座標に統合した結果となっている。単純に点群データを位置合わせして表示してみると、元のRGB-Dデータにはノイズが結構のっていることが分かる。


コメント

このブログの人気の投稿

COLMAPでキャリブレーション済みのデータを使う

5点アルゴリズムによるカメラ位置・姿勢の推定

2D-3D対応からのカメラ位置・姿勢の推定