![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
前のチュートリアル: リマッピング
次のチュートリアル: ヒストグラム均等化
| 原著者 | Ana Huamán |
| 互換性 | OpenCV >= 3.0 |
このチュートリアルでは、以下の方法を学ぶ:
上記から、アフィン変換は次のものを表現するために使用できる:
本質的に、アフィン変換は2つの画像間の 関係 を表すことがわかる。
アフィン変換を表現する一般的な方法は、\(2 \times 3\) 行列を使用することである。
\[ A = \begin{bmatrix} a_{00} & a_{01} \\ a_{10} & a_{11} \end{bmatrix}_{2 \times 2} B = \begin{bmatrix} b_{00} \\ b_{10} \end{bmatrix}_{2 \times 1} \]
\[ M = \begin{bmatrix} A & B \end{bmatrix} = \begin{bmatrix} a_{00} & a_{01} & b_{00} \\ a_{10} & a_{11} & b_{10} \end{bmatrix}_{2 \times 3} \]
\(A\) と \(B\) を用いて2Dベクトル \(X = \begin{bmatrix}x \\ y\end{bmatrix}\) を変換したい場合を考えると、次のようにして同じことができる:
\(T = A \cdot \begin{bmatrix}x \\ y\end{bmatrix} + B\) または \(T = M \cdot [x, y, 1]^{T}\)
\[T = \begin{bmatrix} a_{00}x + a_{01}y + b_{00} \\ a_{10}x + a_{11}y + b_{10} \end{bmatrix}\]
点1、2、3(画像1で三角形を形成している)は画像2に写像され、依然として三角形を形成しているが、今や著しく変化している。これら3つの点(好きなように選んでよい)でアフィン変換を求めれば、見つかったこの関係を画像内のすべてのピクセルに適用できる。
画像を読み込む。
アフィン変換: 上の行で説明したとおり、アフィン変換の関係式を導くには3点からなる2組の点が必要である。次を見てほしい:
これらの点を描画してみると、点がどのように変化するかをより理解しやすくなる。それらの位置は、(理論セクションの)例示図に描かれているものとおおよそ同じである。3点で定義される三角形のサイズと向きが変化することに気づくだろう。
両方の組の点が揃ったら、OpenCVの関数 cv::getAffineTransform を使ってアフィン変換を計算する:
出力として \(2 \times 3\) の行列が得られる(この場合は warp_mat)
次に、求めたアフィン変換を src 画像に適用する
引数は次のとおり:
最初の変換画像が得られた。これは後ほど表示する。その前に、画像を回転させたい...
回転: 画像を回転させるには、次の2つを知る必要がある:
これらのパラメータは次のスニペットで定義する:
OpenCVの関数 cv::getRotationMatrix2D で回転行列を生成する。この関数は \(2 \times 3\) の行列を返す(この場合は rot_mat)
求めた回転を、前の変換の出力に対して適用する:
最後に、結果を2つのウィンドウに表示し、念のため元画像も表示する:
あとはユーザーがプログラムを終了するまで待つだけである
最初のアフィン変換を適用すると、次が得られる:
そして最後に、負の回転(負は時計回りを意味することを思い出してほしい)とスケール係数を適用すると、次が得られる: