我对投影变换矩阵中元素的含义有疑问,例如:在OpenCv
warpPerspective
使用的单应性中。
我知道亲和变换的基础,但在这里我对投影变换更感兴趣,在下面显示的矩阵中表示元素A31
和A32
:
A11 A12 A13
A21 A22 A23
A31 A32 1
我玩了一些值,这意味着所有其他元素都有一个固定的数字。含义:
1 0 0
0 1 0
A31 A32 1
只有投射元素。
但究竟是什么导致A31和A32元素?像A13和A23一样负责水平和垂直翻译。
这两个元素有一个简单的解释吗?就像拥有正值意味着....具有负面价值意味着.......某事物像那样。
希望有人能帮助我。
答案 0 :(得分:4)
牛顿的描述是正确的,但实际看到变换以了解正在发生的事情以及它们如何与变换矩阵中的其他值一起工作以使其更有意义可能会有所帮助。我将给出一些带有动画的python / OpenCV示例,以显示这些值做什么。
import numpy as np
import cv2
img = cv2.imread('img1.png')
h, w = img.shape[:2]
# initializations
max_m20 = 2e-3
nsteps = 50
M = np.eye(3)
所以这里我将转换矩阵设置为标识(无转换)。我们希望看到在变换矩阵M
中更改元素(2,0)的效果,因此我们将通过在nsteps
到{{之间线性间隔0
循环来制作动画。 1}}。
max_m20
我将此应用于从Oxford's Visual Geometry Group拍摄的图像。
确实,我们可以看到这类似于围绕与图像左边缘对齐的点旋转相机,或围绕轴旋转图像本身。但是, 与此有点不同。请注意,顶部边缘始终保持在顶部,这有点奇怪。我们不会像上面那样围绕轴旋转,而是想象顶边也会开始在右边缘上下降。像这样:
好吧,如果你正在考虑转换,一个简单的方法来进行转换就是采取上面的转换,并添加一些偏斜失真,以便在右下角被推下时向右推顶起来。这实际上就是这个视图的创建方式:
for m20 in np.linspace(0, max_m20, nsteps):
M[2, 0] = m20
warped = cv2.warpPerspective(img, M, (w, h))
cv2.imshow('warped', warped)
k = cv2.waitKey(1)
if k == ord('q') & 0xFF:
break
因此,考虑这些矩阵中的观点的正确方法是,IMO,具有偏斜条目和最后一行。那些是单应矩阵中的两个位置,其中角度实际上被修改*;否则,它只是旋转,缩放和平移---所有这些都是角度保持。
*注意:实际上,角度可以用我没有提到的另一种方式改变。仿射变换允许非均匀缩放,这意味着您可以拉伸宽度而不是高度的形状,反之亦然,这也会改变角度。想象一下,如果你有一个三角形并且仅在宽度上拉伸它;角度会改变。因此,事实证明,非均匀缩放(即当变换矩阵的第一个和中间元素是不同的值时)除了透视变化和剪切变形之外,还可以 修改角度。
请注意,在这些示例中,同样适用于最后一行中具有另一个倾斜位置的第二个条目;唯一的区别是它发生在顶部而不是左侧。两种情况下的负值都类似于沿着该轴旋转平面,而不是远离相机。
答案 1 :(得分:2)
单应矩阵的3x1,3x2元素改变了图像的平面。这是Affine和Homography矩阵之间的区别。例如,考虑这一点 - A31沿左边缘改变图像的平面。就像把你的形象粘在像旗子一样的棍子上并旋转。正面是顺时针方向,负面方面是逆转方面。另一个元素从顶部边缘做同样的事情。但是,他们一起为你的形象设置了一个平面。这是我能说的最简单的方法。