2014-12-02 113 views
0

我有一个坐标(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

如果我理解正确的话,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