用Python在2D平面中的点的透视变换

时间:2019-11-04 17:46:55

标签: python perspective

我有以下图像,其中牛舍的四个角为-[((x1,y1),(x2,y2),(x3,y3),(x4,y4)]。捕获图像的相机位于(x1,y1)和(x4,y4)的中间。由于(x3,y3)和(x2,y2)远离相机,因此在图像中,x1-x4不等于x2-x3。

enter image description here

我需要将外壳重新投影到具有[[x1,y1),(x2,y2),(x3,y3),(x4,y4)]和不大可能是原始图像的角的二维矩形平面中平面将具有x1-x4 = x2-x3。有可行的选择吗? OpenCV带有仅可应用于图像的透视变换功能。但是,在这种情况下,我将在原始平面上有一些x,y位置的牛,需要将其转换并绘制到矩形2d平面中以显示牛的位置。

1 个答案:

答案 0 :(得分:2)

这个问题比编程更是线性代数。您在简单的四边形上进行了线性变换。数学比较简单,因为您有两个平行于图像边缘的边缘。

首先,我们需要重新定义一些符号:例如,您使用(x2,y2)来引用发布图像上的两个点到期望的位置转换后图像的左上角。我将通过声明转换后的点为A =(x1,y2)和B =(x4,y3)来简化此过程:我们正在水平拉伸梯形的顶部以形成一个矩形。

还要注意,从一开始,y1 = y4和y2 = y3;这简化了计算。可视化叠加的新旧图像,内部有一个问题点Q,其坐标标记在边界上。在“拉伸”之后,我们需要找到Q的变换点R的通用方程。

我还标记了原始图像的中位数MN。在拉伸过程中,该线上的点将不会移动。附带说明一下,沿底部边缘1-4的点将不会移动。 2-3的外围边缘上的点将移动最多。令C为边1-2上的点,其y坐标与Q(以及后来的R)相同;令DMN上的对应点。

A-----2-----M-----3---B
|                     |
Qy  CR  Q  D          |
|                     |
|                     |
1----Rx-Qx-N----------4

我们只需要按比例分配选定点的移动量即可。找出MN1-2的方程是众所周知的(两点公式)。将Qy代入这些等式中的每一个,以获得CxDx

CD转换为(x1, Qy) D时,“伸展”因素是它们的长度之比:(Dx-x1) / (Dx-Cx)Q会根据其拉伸距离D的左移部分(Dx-Qx) / (Dx-x1)向左移动。乘以得到Q移动的距离。从Qx中减去该金额即可得到Rx

是的,您现在在最终的组合方程中有几个常数:x1,x2,x3,x4,y1,y2。您还具有变量Qx和Qy。这是应该的。这给您留下了一个通用方程式,可以转换图像中任意点的Qx => Rx。

如果您还计划垂直拉伸,则在垂直方向上将应用相同的比例。我建议你一次做一次伸展运动。这将使数学保持模块化:易于在单独的阶段进行检查和调试。

这会让你动起来吗?

D将不会移动;