![]() |
OpenCV 4.12.0
開源計算機視覺
|
| 原始作者 | Ana Huamán |
| 相容性 | OpenCV >= 3.0 |
在本教程中,您將學習如何
由上可知,我們可以使用仿射變換來表達
您可以看到,仿射變換本質上表示了兩個影像之間的關係。
表示仿射變換的常用方法是使用 \(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\) 變換一個二維向量 \(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個點來推導仿射變換關係。請看
您可能想繪製這些點,以便更好地瞭解它們如何變化。它們的位置與示例圖(在理論部分)中所示的位置大致相同。您可能會注意到由3個點定義的三角形的大小和方向發生了變化。
有了這兩組點,我們使用OpenCV函式 cv::getAffineTransform 計算仿射變換。
我們得到一個 \(2 \times 3\) 矩陣作為輸出(在本例中為 warp_mat)
然後我們將剛剛找到的仿射變換應用於源影像
引數如下
我們剛剛得到了第一張變換後的影像!我們將在一會兒顯示它。在此之前,我們還想旋轉它...
旋轉:要旋轉影像,我們需要知道兩件事
我們透過以下程式碼片段定義這些引數
我們使用OpenCV函式 cv::getRotationMatrix2D 生成旋轉矩陣,它返回一個 \(2 \times 3\) 矩陣(在本例中為 rot_mat)
現在我們將找到的旋轉應用於我們先前變換的輸出影像
最後,我們會在兩個視窗中顯示結果,並額外顯示原始影像以作比較
我們只需等待使用者退出程式
應用第一次仿射變換後,我們得到
最後,在應用負旋轉(請記住負值表示順時針)和縮放因子後,我們得到