我有某个角度旋转图像上某个点的 x、y 坐标。我想在原始的非旋转图像中找到同一点的坐标。
请检查第一个更简单的图像:
更新的图像,简化:
旧图像:
我有某个角度旋转图像上某个点的 x、y 坐标。我想在原始的非旋转图像中找到同一点的坐标。
请检查第一个更简单的图像:
更新的图像,简化:
旧图像:
首先要做的是定义参考系统(如何将“点相对于每个图像的位置”转换为数字)。我猜你想依赖一个基本的 2D 参考系统,由一个点(几个 X/Y 值)给出。例如:左/下角(最小 X 和最小 Y)。
该算法非常简单:
获取与旋转形状关联的新定义参考点(最小 X 和最小 Y),即确定 RefX_new 和 RefY_new。
在参考系统之间应用基本转换:
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,这些将是最终的值)。
假设第一个点是 A,第二个点是 B,最后一个点是 C。我假设你有旋转矩阵 R(如果没有,请参阅 Wikipedia Rotation Matrix)和平移向量 t,因此 B = R*A 和 C =乙+吨。它得出 C = R*A + t,因此 A = R^1*(Ct)。
编辑:如果您只需要未旋转的新点,只需执行D = R^-1*C。