具有坐标的数组的透视变换

时间:2014-12-02 13:53:48

标签: python opencv coordinates transform perspective

我有一个坐标(2D)的数组,想要计算不同四边形的新坐标。我只知道两个四边形的角落。

例如,旧的四边形角坐标是

topleft(25,25), Topright(200,20), Botomleft(35,210), Botomright(215,200)

新的四边形:

Topleft(-50,50), Topright(50,50), Botomleft(-50,-50), Botomright(-50,-50)

opencv(cv2)中是否有特定的功能,甚至是公式。

我正在寻找相当长的一段时间,我似乎只能找到矩阵计算或函数来转换整个图像或数组。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,opencv就有你需要的东西:

首先,计算变换矩阵:

import cv2
import numpy as np
src = np.array(((25, 25), (200, 20), (35, 210), (215, 200)), dtype=np.float32)
dest = np.array(((-50, -50), (50, -50), (-50, 50), (50, 50)), dtype=np.float32)
mtx = cv2.getPerspectiveTransform(src, dest)

你会注意到我在计算变换(倒置的顶部和底部)之前冒了dest的方向匹配src的一个。

现在矩阵可用于转换任何点数组(在我们的例子中为2D):

original = np.array([((42, 42), (30, 100), (150, 75))], dtype=np.float32)
converted = cv2.perspectiveTransform(original, mtx)

结果:

>>> converted
>>> array([[[-41.06365204 -40.27705765]
      [-49.48046112  -8.70405197]
      [ 18.60642052 -19.92881393]]])

作为最后的建议,请注意输入点数组original的形状:它必须是一个3D数组,因为我发现了here