我有一张已“扭曲”的原始图像。有人可以帮我计算一下原始图像中的给定点将出现在扭曲图像中的位置吗?
我有一个图像,里面有一个矩形。我知道平面图像中 A、B、C、D、E 和 F 点在哪里。
+------------------------------------------------+
| |
| A B |
| +-------------------+ |
| | | |
| | •F | |
| | | |
| | | |
| | | |
| | •E | |
| +-------------------+ |
| C D |
| |
+------------------------------------------------+
新图像 (A') 的创建是由于相机设置不完善导致图像变形。我现在有 A'、B'、C'D'、E'、F'。
我不一定要“扭曲”图像,我只想要新坐标空间中的坐标,即该点结束的位置。鉴于我知道 A、B、C、D、E、F、A'、B'、C'、D' 和 E'(在各自的图像中)的位置,是否有足够的信息来简单地计算新的 E' 在哪里点应该在图像中吗?
我觉得这是一个 3D 矩阵变换,但数学超出了我的范围,我正在尝试找出可以求解 (E') 新坐标的方程。我想从技术上讲,这是一个通过 3D 空间投影到 2D 表面上的 2D 对象。
+------------------------------------------------+
| |
| A' |
| +--------- B' |
| | -----------+ |
| | | |
| | •F' | |
| | | |
| | | |
| | | |
| | •E' | |
| | -------+ |
| +------------ D' |
| C' |
| |
+------------------------------------------------+
如果我需要添加另一个点(G 和 G'),为了求解 E',我可以添加它。
我能够理解的是,这将求解一系列联立方程,但我不确定需要多少“已知”来求解 E'(x,y)。
我在 iOS(目标 C)中执行此操作,但我不太关心实际编码,我实际上只是想找到解决方案矩阵(如果这是正确的术语)。
这种变换(具有透视效果的 2D 到 2D)就是所谓的单应性,可以用 8 个系数来描述(
a
到 h
):
X = (a.x + b.y + c) / (g.x + h.y + 1)
Y = (d.x + e.y + f) / (g.x + h.y + 1)
您可以轻松地将这些方程线性化为:
a.x + b.y + c - g.x.X - h.y.X = X
d.x + e.y + f - g.x.Y - h.y.Y = Y
你可以通过取四个点(四个角)来解决它们,这会给你八个未知数的八个方程,从那里你可以变换任何新点。
由于单应性的逆也是单应性,因此您可以通过两种方式应用此分辨率(直立到扭曲或相反)。确保您要查找的未知坐标在上述开发中显示为
(X, Y)
(而不是 (x, y)
)。
你需要视角转换。
Anti-Grain Geometry 库(工作链接)中实现了透视变换(将任意凸四边形映射到矩形,反之亦然)。
使用
agg_trans_perspective
,您可以计算透视变换矩阵(使用您的点A, B, C, D, A', B', C', D'
),然后将其应用于从一个四边形到另一个四边形的地图坐标(E to E'
或E' to E
)。