python - 带坐标的数组的透视变换

标签 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) 中是否有特定的函数来执行此操作,甚至是公式。

我搜索了很长一段时间,我似乎只能找到矩阵计算或函数来转换整个图像或数组。

最佳答案

如果我理解正确的话,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 的方向匹配(颠倒顶部和底部)。

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

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]]])

作为最后的建议,请注意输入点数组原始的形状:它必须是一个 3D 数组,正如我发现的 here .

关于python - 带坐标的数组的透视变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27251138/

相关文章:

python : cant open file 'hw.py' : [Errno 2] No such file or directory

opencv - opencv中的重复轮廓

Python 角色扮演游戏 : finding if an enemy is within a player's range

c++ - 如何使用 GPU 乘以 2 个 OpenCV 垫

swift - SpriteKit 跨设备在 View 框架内生成对象

java - 如何减去或添加两个坐标

python - Pandas 绘制 4 个数据帧系列中的 2 个子图

Python:检测图像何时与另一图像碰撞

python - 具有多个 "if"条件的双循环

python - IronPython 2.7 与 NetworkX 1.8.1