【问题标题】:How to make a affine transform matrix to a perspective transform matrix?如何将仿射变换矩阵制作成透视变换矩阵?
【发布时间】:2020-08-11 06:31:12
【问题描述】:

来自代码

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)

打印(旋转3):

[[ 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 行?我该怎么做?

【问题讨论】:

标签: python numpy opencv matrix affinetransform


【解决方案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.  ]

--> 看看

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2014-04-06
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多