我有以下图像,其中牛舍的四个角为-[((x1,y1),(x2,y2),(x3,y3),(x4,y4)]。捕获图像的相机位于(x1,y1)和(x4,y4)的中间。由于(x3,y3)和(x2,y2)远离相机,因此在图像中,x1-x4不等于x2-x3。
我需要将外壳重新投影到具有[[x1,y1),(x2,y2),(x3,y3),(x4,y4)]和不大可能是原始图像的角的二维矩形平面中平面将具有x1-x4 = x2-x3。有可行的选择吗? OpenCV带有仅可应用于图像的透视变换功能。但是,在这种情况下,我将在原始平面上有一些x,y位置的牛,需要将其转换并绘制到矩形2d平面中以显示牛的位置。
答案 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
)相同;令D
为MN
上的对应点。
A-----2-----M-----3---B
| |
Qy CR Q D |
| |
| |
1----Rx-Qx-N----------4
我们只需要按比例分配选定点的移动量即可。找出MN
和1-2
的方程是众所周知的(两点公式)。将Qy
代入这些等式中的每一个,以获得Cx
和Dx
。
将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
将不会移动;