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 件のコメント:
コメントを投稿