透视投影,4 点

2023-11-30

我正在尝试实现透视投影。例如,我有一个给定大小的正方形,并且已知角点坐标 (A1 .. A4) 。我有一个图像,其中该正方形显示在某个特定位置。我知道它的位置和显示的正方形 B1 .. B4 的角坐标。我想找到一个变换矩阵 M 翻译 B -> A。

我按照方法数学插图,第10章,我成功地改造了3个角。但我找不到正确变换 4 个角的矩阵...我找到第 7 页上的矩阵,但它不能很好地转换所有 4 个点。

~


正如您的参考文献所示,表示一般投影变换的标准方法是增强您的(x,y)二维坐标w坐标(得到齐次坐标 [x,y,w]),并使用 3x3 矩阵对其进行变换。

从您的问题中尚不清楚您目前正在如何尝试使用您的积分,但我怀疑如何使用额外坐标存在一些困惑。从数学上讲,要记住的是,您可以将整个齐次向量乘以任意非零缩放因子(因为最终除以第三个坐标将抵消缩放因子)。然而,有时很难弄清楚这在实际意义上意味着什么......

对于这个问题,按如下方式设置系统(我在这里将齐次坐标视为行向量,以匹配您的参考):

Find a 3x3 matrix T, such that:
  it maps each point b to corresponding point a:  a = b  T
  specifically:

     w' * [a_x a_y 1] = w * [b_x b_y 1] * [ T_xx T_xy T_xw ]
                                          [ T_yx T_yy T_yw ]
                                          [ T_wx T_wy T_ww ]

棘手的一点:你不能只是设置w and w'到 1. 这是因为射影变换T 不一定保持第三个坐标不变! (如果确实如此,您可以完全跳过齐次位,并仅使用三个点对获得仿射变换......)。

表达这个问题的一种方法(以一种可以轻松解决的方式)是添加一个参数,K = w' / w。那么你可以将上面的表达为一个线性系统,如下:

for each point b and corresponding point a,
  [a_x a_y 1] * K = [b_x b_y 1] * [ T_xx T_xy T_xw ]
                                  [ T_yx T_yy T_yw ]
                                  [ T_wx T_wy T_ww ]

请记住,所有a and b值是固定常数;你正在尝试解决你的九个要素T矩阵。每个点对添加三个约束(来自上面的向量等式)和一个附加参数(该方程的 K),总共 4*3=12 个约束和 9+4=13 个参数。所以,我们在这里缺少一个约束......

需要额外的约束,因为矩阵T实际上具有任意缩放因子:它是齐次坐标之间的映射(无论如何都除掉任意缩放因子),因此没有固有的方法来决定该缩放因子是什么。解决这个因素的一种方法是任意设置T_ww = 1:

for each point pair (a, b):
  [a_x a_y 1] * K = [b_x b_y 1] * [ T_xx T_xy T_xw ]
                                  [ T_yx T_yy T_yw ]
                                  [ T_wx T_wy  1   ]

这给你一个完全确定的线性系统:

  0  = b1_x*T_xx + b1_y*T_yx + 1*T_wx - a1_x*K1
  0  = b1_x*T_xy + b1_y*T_yy + 1*T_wy - a1_y*K1
-1*1 = b1_x*T_xw + b1_y*T_yw          -    1*K1

  0  = b2_x*T_xx + b2_y*T_yx + 1*T_wx - a2_x*K2
  0  = b2_x*T_xy + b2_y*T_yy + 1*T_wy - a2_y*K2
-1*1 = b2_x*T_xw + b2_y*T_yw          -    1*K2

  0  = b3_x*T_xx + b3_y*T_yx + 1*T_wx - a3_x*K3
  0  = b3_x*T_xy + b3_y*T_yy + 1*T_wy - a3_y*K3
-1*1 = b3_x*T_xw + b3_y*T_yw          -    1*K3

  0  = b4_x*T_xx + b4_y*T_yx + 1*T_wx - a4_x*K4
  0  = b4_x*T_xy + b4_y*T_yy + 1*T_wy - a4_y*K4
-1*1 = b4_x*T_xw + b4_y*T_yw          -    1*K4

您现在有 12 个变量的 12 个线性方程(矩阵元素T_**和附加缩放参数K*)。使用线性代数库来求解系统并获得结果(假设您不想编写自己的求解器......)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

透视投影,4 点 的相关文章

  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • javascript的随机实现在各种浏览器中的可信度如何?

    我想做一些关于 javascript 和加密的实验 我很好奇随机函数的实现是如何不可预测的 有人做过硬测试吗 显然 浏览器有能力生成强随机性 对于 ssl 问题是它们是否赋予 javascript 相同的强度 一般来说 随机函数在加密方面并
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http
  • 解释 Vinay Deolalikar 的证明 P != NP [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近有一个paper https www win tue nl gwoegi P versus NP Deolalikar pdf惠普实验
  • 如何在 C# 中计算 power-of?

    我不太擅长数学 而且 C 似乎没有提供幂函数 所以我想知道是否有人知道我将如何进行这样的计算 var dimensions 100 100 100 00 3 00 See Math Pow http msdn microsoft com e
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • C 中的浮点运算是否具有结合律?

    加法在数学上具有结合律 a b c a b c 在一般情况下 此属性不适用于浮点数 因为它们表示有限精度的值 作为优化的一部分 从 C 程序生成机器代码时 编译器是否允许进行上述替换 C标准中到底在哪里说的 不允许编译器执行 优化 这将导致
  • 我在哪里可以学习游戏物理及其背后的数学基础知识? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学学过数学 三角学 微积分 II 但我不知道为什么在游戏物理中使用 tan arctan 等 我
  • matlab中求和函数句柄

    Hi我试图对两个函数句柄求和 但它不起作用 例如 y1 x x x y2 x x x 3 x y3 y1 y2 我收到的错误是 对于 function handle 类型的输入参数 未定义函数或方法 plus 这只是一个小例子 实际上我实际
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • 透视变换矩阵的计算

    给定 3D 空间中的一个点 如何计算齐次坐标中的矩阵 将该点投影到平面上z d 其中原点是投影中心 好吧 让我们尝试解决这个问题 扩展伊曼纽尔的答案 Assuming如果您的视图向量直接沿着 Z 轴 则所有尺寸都必须按视图平面距离的比例进行
  • 如何找到列表S的所有分区为k个子集(可以为空)?

    我有一个唯一元素列表 比方说 1 2 我想将其拆分为 k 2 个子列表 现在我想要所有可能的子列表 1 2 1 2 2 1 1 2 我想分成 1 1 2 我怎样才能用 Python 3 做到这一点 更新 我的目标是获取 N 个唯一数字列表的
  • 对文本变量进行数学求和? (例如 5865/100 )

    我有一个变量是 whatever 5865 100 这是一个文本变量 我希望它计算 5865 100 以便我可以将其添加到其他数字并进行计算 Number format 不起作用 因为它只返回 5 865 而我希望它返回 58 65 我可以
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • 当我调用 fillRoundRect() 时,只有 1 个角被圆化

    当运行此代码时 import java awt Color import java awt Graphics import java awt Graphics2D import java awt RenderingHints import
  • 为什么 C# 默认不使用算术溢出检查? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么语言默认情况下不会引发整数溢出错误 https stackoverflow com questions 103654 why dont languages raise errors on int
  • 向量数学,在两个向量之间的平面上查找坐标

    我正在尝试沿着样条线生成 3d 管 我有样条线的坐标 x1 y1 z1 x2 y2 z2 等 您可以在黄色插图中看到 在这些点上 我需要生成圆圈 其顶点将在稍后的体育场连接 这些圆需要垂直于样条线两条线段的 角 才能形成正确的管 请注意 出
  • 将线条剪裁到绘图区域并在绘图区域外显示文本

    我想限制绘图的可见 y 范围 为了保留超出此范围的值 我需要设置oob 出界 to rescale none这效果很好 不过 我还想在图外的页边空白处添加一些文本 为了做到这一点 我需要关闭剪辑 这会导致超出范围的值被绘制在绘图区域之外的边
  • 如何确定 n 高数字金字塔中的最大路线成本

    我有一个像这样的数字金字塔 7 4 8 1 8 9 2 4 6 7 4 6 7 4 9 4 9 7 3 8 8 routes 32 每个数字都按其系列中的强大程度进行索引 0 9 gt 1 1 8 gt 5 2 8 gt 4 3 7 gt
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int

随机推荐