【问题标题】:Finding the original position of a point on an image after rotation旋转后在图像上查找点的原始位置
【发布时间】:2013-06-18 11:31:47
【问题描述】:

我有旋转图像上某个点的 x、y 坐标某个角度。我想在未旋转的原始图像中找到同一点的坐标。

请查看第一张比较简单的图片:

更新图片,简化:

旧图:

【问题讨论】:

  • 您的图片链接已损坏
  • 我看不到最后的图像,因为我的办公室中的某些链接被阻止了。但我认为他们会在其他网络上工作。对此深表歉意,我会从其他机器上重新制作图像。
  • 我重新上传了图片链接,请问您现在可以查看吗?很抱歉我仍然无法看到它,因为 imgur 在我的办公室网络中被阻止。

标签: geometry image-rotation


【解决方案1】:

假设第一个点是 A,第二个点是 B,最后一个点是 C。我假设你有旋转矩阵 R(如果没有,请参阅 Wikipedia Rotation Matrix)和平移向量 t,因此 B = R* A 和 C = B+t。 它得出 C = R*A + t,因此 A = R^1*(C-t)。

编辑:如果你只需要非旋转的新点,只需做 D = R^-1*C。

【讨论】:

  • 谢谢,但我没有使用旋转矩阵!而是使用一些三角公式...
  • 在这种情况下,我们需要更多信息:旋转的中心在哪里?是 (0,0) 吗?我的印象是您的坐标系在旋转过程中发生了变化(A->B)。
  • 是的...图像围绕中心旋转。 x, y 位置分别从左上角计算。因为它在基于浏览器的环境中。当图像旋转时,框架会扩展以保持图像完整,这意味着避免切割图像的任何角落。因此 x, y 位置。的点受到影响!
【解决方案2】:

首先要做的是定义参考系统(如何将“点相对于每个图像的位置”转换为数字)。我猜你想依赖一个基本的 2D 参考系统,由一个点(几个 X/Y 值)给出。例如:左/下角(最小 X 和最小 Y)。

算法非常简单:

  1. 获取与 旋转形状(最小 X 和最小 Y),即确定 RefX_new 和 RefY_new。

  2. 在参考系统之间应用基本转换:
    X_old = X_new + (RefX_new - RefX_old)
    Y_old = Y_new + (RefY_new - RefY_old)

------------------ 将公式与新车图片相关联的更新

RefX_old = 旋转前 CarFrame 的最小 X 值。

RefY_old = CarFrame 在旋转之前的最大 Y 值。

RefX_new = CarFrame 旋转后的最小 X 值。

RefY_new = CarFrame 旋转后的最大 Y 值。

X_new = 旋转后点相对于 CarFrame 的 X。例如:如果相对于绝对坐标系 (0,0) 的 RefX_new = 5,并且相对于这个绝对坐标系的点的 X 为 8,则 X_new 将为 3。

Y_new = 旋转后相对于 CarFrame 的点的 Y(相当于上面的点)


X_old_C = X_new_C(相对于 CarFrame) + (RefX_new(CarFrame_C) - RefX_old(CarFrame_A))

Y_old_C = Y_new_C(相对于 CarFrame) + (RefY_new(CarFrame_C) - RefY_old(CarFrame_A))


这些坐标是相对于 CarFrame 的,因此您可能必须相对于绝对框架(我猜是 0,0)更新它们,如上所述,即:

X_old_D_absolute_frame = X_old_C + (RefX_new(CarFrame_C) + RefX_global(即 0))

Y_old_D_absolute_frame = Y_old_C + (RefY_new(CarFrame_C) + RefY_global(即 0))

(尽管您应该在 CarFrame 相对于全局框架处于其“确定位置”时执行此操作,即在图片 D 上(该点相对于图片 C 和 D 中的 CarFrame 具有相同的坐标) ,但与全局框架不同)。)

这样说可能有点复杂;但这真的很简单。您只需仔细考虑一种情况并创建执行所有操作的算法。这个想法非常简单:如果我在从 5 开始的东西里面的 8 ;关于容器,我在 3 上。

------------ 方法更新

正如评论中所说,这些最后的图片证明了最初提出的参考计算(最大 Y/最小 X)是不正确的:它不应该是最大/最小。 carFrame 的值,但到较近边的最小距离(= 从左侧/底部到该点的垂直线)。

------------ 具体示例的三角计算

建议的算法是您应该在任何情况下应用的算法。尽管在这种特定情况下,最困难的部分不是从一个参考系统移动到另一个参考系统,而是在旋转系统中定义参考点。完成此操作后,将立即应用于非旋转案例。

这里你有一些计算来执行这个动作(我做得很快,所以最好把它作为一个方向,自己做);我也只考虑了图片中的情况,即左/下点的旋转:

X_rotated = dx * Cos(alpha)

其中 dx = X_orig - (max_Y_CarFrame - Y_Orig) * Tan(alpha)

Y_rotated = dy * Cos(alpha)

其中 dy = Y_orig - X_orig * Tan(alpha)

注意:dx 中的 (max_Y_CarFrame - Y_Orig) 和 dy 中的 X_orig 期望基本参考系为 0,0(最小 X 和最小 Y)。如果不是这种情况,则必须更改此变量。

X_rotated 和 Y_rotated 给出了从该点到 carFrame 最近一侧(分别为左侧和底部)的垂直距离。通过应用这些公式(我坚持:仔细分析它们),您得到 X_old_D_absolute_frame/Y_old_D_absolute_frame,也就是说,您只需添加来自 carFrame 的左/下值(如果它位于 0,0,这些将是最终的值)。

【讨论】:

  • 如何在基于浏览器的环境中设置和使用参考系统?点 x、y 坐标分别从左上角测量。
  • 你有你的参考系统。每个元素的参考坐标将是给定形状的最小 X 和最大 Y 值。根据编程语言的不同,有不同的方法可以实现这一点,在 .NET 中,它是通过属性 .left 和 .top 完成的。您使用哪种语言?
  • JavaScript 赢了!问题是在旋转 1 级后,图像会扩展(将正方形旋转 45 度并且它会以 w/h 扩展),从而扩展外框,这会干扰我的参考系统!
  • 这就是为什么在第 1 步中我说“获取新的定义参考点”;你必须得到新的分钟。 X,最大值Y 为旋转后的容器。在这里你有一些帮助:stackoverflow.com/questions/288699/…
  • 我尝试从新的 x/y 坐标中减少新的偏移量,但没有运气,我仍然无法在原始未旋转图像上映射确切的值。我可能做错了什么。因此,我在问题摘要中添加了更清晰的用例图像,请告诉我您所描述的参考方法将如何工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多