如何使仿射变换矩阵成为透视变换矩阵?

时间:2020-04-27 16:15:27

标签: python numpy opencv matrix affinetransform

来自代码

rotation = cv2.getRotationMatrix2D((0, 0), 47.65, 1.0)

我有一个旋转变换矩阵,例如:

[[ 0.67365771  0.7390435   0.        ]
 [-0.7390435   0.67365771  0.        ]]

由于旋转是仿射变换的特例,我认为这是一个有效的仿射变换矩阵,对吗?

由于仿射变换是透视变换的特例,所以我也认为,如果我对此进行一些修改,则该矩阵将是有效的透视变换矩阵。

所以我尝试再增加1行以使其形状为3 x 3。

newrow = numpy.array([numpy.array([1, 1, 1])])  # [[0 0 0]]
rotation3 = numpy.append(rotation, newrow, axis=0)

print(rotation3):

[[ 0.67365771  0.7390435   0.        ]
 [-0.7390435   0.67365771  0.        ]
 [ 1.          1.          1.        ]]

但是rotation3似乎不能作为透视矩阵正常工作,这是我对其进行测试的方式:

rotated_points = cv2.perspectiveTransform(points, rotation3)

rotated_points看起来不像points

[1,1,1]是正确的第3行,我也应该更改第1行和第2行吗?以及我该怎么办?

1 个答案:

答案 0 :(得分:1)

基本上您是对的,仿射变换是透视变换的特例。

单位矩阵的透视变换不会导致输出更改: (身份3x3矩阵)

[1,0,0]
[0,1,0]
[0,0,1] 

因此,如果要将仿射变换矩阵增长到透视图,则需要添加此恒等矩阵的最后一行。

您的示例如下:

 [ 0.67365771  0.7390435   0. ]
 [-0.7390435   0.67365771  0. ]
 [ 0.          0.          1. ]

应用上述透视垫具有与应用仿射变换具有以下效果相同的效果:

 [ 0.67365771  0.7390435   0.  ]
 [-0.7390435   0.67365771  0.  ]

->看看