2021年6月3日木曜日

OpenCV アフィン変換の合成

OpenCV を使って、アフィン変換の合成をしようとしたら、うまく動作しなくてハマったので忘備録。

OpenCV で画像の回転をかけるアフィン変換を求める関数として、

  cv::getRotationMatrix2D という関数があります。

これが曲者、返されるのは 3 x 2 の行列で、アフィン変換の合成に使えない。
また、cv::warpAffine というのもあって、こいつも 3 x 2 の行列を受け取るアフィン変換の簡易バージョンで使えない

w1 x h1 の中心に alpha 回転し、横方向だけ n倍し、w2 x h2 のサイズに中心を移動したかったが、四苦八苦しました。

  cv::Mat ms = (cv::Mat_<double>(3,3) 
      << 1.0, 0.0, - w1 / 2.0,
         0.0, 1.0, - h1 / 2.0,
         0.0, 0.0, 1.0);
  cv::Mat rot = (cv::Mat_<double>(3,3)
      <<   cos(alpha), sin(alpha), 0.0,
         -sin(alpha), cos(alpha), 0.0,
         0.0,          0.0,         1.0);
  cv::Mat rat = (cv::Mat_<double>(3, 3)
      <<  n,  0.0, 0.0,
         0.0, 1.0, 0.0,
         0.0, 0.0, 1.0);
  cv::Mat mms = (cv::Mat_<double>(3,3)
      << 1.0, 0.0, w2 / 2.0,
      0.0, 1.0, h2 / 2.0,
      0.0, 0.0, 1.0);
  cv::Mat par = mms * rat * rot * ms;
  // src は (w1,h1)の入力画像
  // dst は (w2,h2)の出力画像
  cv::warpPerspective(src, dst, par, cv::Size(w2,h2), cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
とする事で、うまく合成変換できました。 #combine affine transform opencv

0 件のコメント: