![]() |
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)
现在我们将找到的旋转应用于我们先前变换的输出图像
最后,我们会在两个窗口中显示结果,并额外显示原始图像以作比较
我们只需等待用户退出程序
应用第一次仿射变换后,我们得到
最后,在应用负旋转(请记住负值表示顺时针)和缩放因子后,我们得到