色付き点群(Colored Point Cloud)の位置合わせ

色付きの2つの点群を位置合わせするための変換行列を推定する。Open3Dでは色付き点群の位置合わせのために、open3d::registration::RegistrationColoredICPが用意されている。この関数を利用する際には、以下のヘッダファイルをインクルードする必要がある。
#include <Open3D/Registration/ColoredICP.h>
色付き点群の生成方法については、RGBDImageからPointCloudへの変換(Open3D)を参照。
色付き点群pcd_target, pcd_srcを位置合わせするコードの例は以下の通り。この例では、位置合わせに全ての点群を用いるのではなく、まず、ダウンサンプルを行い位置合わせの対象とする点群を削減している。また、ダウンサンプル後に、各点に対する法線を推定する処理が入っている。位置合わせ結果は、result_icp(open3d::registration::RegistrationResultクラス)に保持される。このクラスに位置合わせの精度(fitness)や変換行列の情報が保持されている。
  double voxel_size = 0.05;

  auto pcd_target_down =
      pcd_target->VoxelDownSample(voxel_size);
  auto pcd_src_down = pcd_src->VoxelDownSample(voxel_size);

  pcd_target_down->EstimateNormals(
      open3d::geometry::KDTreeSearchParamHybrid(voxel_size, 30));
  pcd_src_down->EstimateNormals(
      open3d::geometry::KDTreeSearchParamHybrid(voxel_size, 30));

  // trans_matには変換パラメータの初期値を入れることができる。
  // 初期値無しの場合は、4x4単位行列(Eigen::Matrix4d)をセットすれば良い
  auto result_icp = open3d::registration::RegistrationColoredICP(
      *pcd_src_down, *pcd_target_down, voxel_size, trans_mat,
      open3d::registration::ICPConvergenceCriteria(
          1e-6, 1e-6, 100));
  trans_mat = result_icp.transformation_;
その他の詳しい説明は、Open3Dの以下のページを参照。
Colored point cloud registration

例のごとくTUMのデータセットを用いて、フレーム間の変換行列をColored ICPで算出し、TSDFで統合するということをやってみた。結果は以下の通り。机を回り込む部分で変換行列の算出がうまくいかず、誤差が蓄積していっていることが分かる。画像ベースのSLAMだともう少し精度良くフレーム間の動きを捉えられているような気がする。精度を向上させるためには、画像ベースのSLAMなどとの統合手法を採用した方が良いかもしれない。


コメント

このブログの人気の投稿

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

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

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