gpt4 book ai didi

python - Python 中 2D 平面中的点的透视变换

转载 作者:行者123 更新时间:2023-12-01 00:24:33 24 4
gpt4 key购买 nike

我有以下图像,其中牛舍的四个角是 -[(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 平面中以显示牛的位置。

最佳答案

这个问题与其说是编程问题,不如说是线性代数问题。您在一个简单的四边形上进行了线性变换。数学更简单,因为有两条边与图像的边缘平行。

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

另请注意,从一开始就有 y1=y4 和 y2=y3;这简化了计算。想象新旧图像重叠,内部有一个问题点Q,其坐标标记在边界上。我们需要找到“拉伸(stretch)”后 Q 变换点 R 的一般方程。

我还标记了原始图像的中位数,MN。该线上的点在拉伸(stretch)过程中不会移动。附带说明一下,沿底部边缘 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 时的“拉伸(stretch)”因子是它们的长度之比:(Dx-x1)/( Dx-Cx)。 Q 将根据其距 D 左侧的距离向左移动该拉伸(stretch)因子的比例:(Dx-Qx)/(Dx-x1)。将它们相乘即可得到 Q 移动的距离。从 Qx 中减去该金额即可得到 Rx

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

如果您也打算垂直拉伸(stretch),则相同的比例将适用于垂直方向。我建议你一次做一个拉伸(stretch)运动;这将使数学保持模块化:更容易在不同的阶段进行检查和调试。

这会让你感动吗?

D 不会移动;

关于python - Python 中 2D 平面中的点的透视变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58698637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com