cv::MatをOpen3Dの形式に変換する

Open3DでRGB-Dデータの統合でカラー画像、デプス画像を読み込んで以下のようにRGBDImageを生成する必要があった。
std::shared_ptr rgbd_img;
rgbd_img = open3d::geometry::RGBDImage::CreateFromColorAndDepth(rgb, depth, depth_scale, depth_trunc, false);
Open3Dにも画像の読み込みを行うための関数が用意されているが、OpenCVで既に書いているプログラムをベースにする場合は、OpenCVのcv::Mat形式からOpen3Dのopen3d::geometry::Image形式に変換できると都合が良い。ということで、cv::MatからOpen3Dの画像形式への変換を行ってみた。カラー画像の変換は以下のようにするとうまくいった。OpenCVはBGR、Open3DはRGBなので、まず、カラーチャンネルの入れ替えを行っている。
  cv::Mat3b rgb_img;
  cv::cvtColor(bgr_img, rgb_img, cv::COLOR_BGR2RGB);
  open3d::geometry::Image rgb;
  rgb.Prepare(rgb_img.cols, rgb_img.rows, rgb_img.channels(), sizeof(uchar));
  memcpy(rgb.data_.data(), rgb_img.data,
         rgb_img.rows * rgb_img.cols * rgb_img.channels() * sizeof(uchar));
同様にデプス画像は以下のようにすることで変換できた。ただし、デプス画像depth_imgは16bitのpngで保存されているものを読み込んでいる。
  open3d::geometry::Image depth;
  depth.Prepare(depth_img.cols, depth_img.rows, depth_img.channels(),
                sizeof(short));
  memcpy(depth.data_.data(), depth_img.data,
         depth_img.rows * depth_img.cols * depth_img.channels() * sizeof(short));

コメント

このブログの人気の投稿

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

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

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