在旋转图像后找到点的原始位置

3
我有一个点在旋转图像中的x、y坐标和旋转角度,我想要找到同一点在原始非旋转图像中的坐标。请查看第一张图片,它更简单: 更新的简化图片: Simplified description 旧图片: enter image description here

你的图像链接已经损坏。 - finnw
由于我办公室的一些链接被阻止,我无法在我的电脑上查看这张图片。但我认为在其他网络上应该可以查看。对此我深表歉意,我会从其他机器重新上传这张图片。 - Rutwick Gangurde
我已重新上传了图片链接,请您现在检查一下好吗?很抱歉,由于我的办公室网络阻止了Imgur,我仍然无法看到它。 - Rutwick Gangurde
2个回答

0
假设第一个点是A,第二个点是B,最后一个点是C。我假设您有旋转矩阵R(如果没有,请参见维基百科Rotation Matrix)和平移向量t,使得B = R*A和C = B+t。 则有C = R*A + t,因此A = R^1*(C-t)。 编辑:如果您只需要非旋转的新点,则只需执行 D = R^-1*C。

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

0

首先要做的是定义参考系统(如何将“点相对于每个图像的位置”转换为数字)。我猜你想依靠一个基本的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值。例如:如果RefX_new相对于绝对坐标系(0,0)为5,而该点相对于此绝对坐标系的X值为8,则X_new将为3。

Y_new是相对于CarFrame旋转后的点的Y值(与上面的点等效)


X_old_C = X_new_C(相对于车架)+(RefX_new(车架_C)- RefX_old(车架_A))

Y_old_C = Y_new_C(相对于车架)+(RefY_new(车架_C)- RefY_old(车架_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上。

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

如评论所述,这些最后的图片证明了最初提出的参考计算(max.Y/min.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,即只需添加车框的左/底值(如果位于0,0,则将是最终值)。


我尝试从新的x/y坐标中减少新偏移量,但没有成功,我仍然无法在原始未旋转的图像上映射出精确的值。我可能做错了什么。因此,我在我的问题摘要中添加了一个更清晰的用例图像,请告诉我您描述的参考方法在这里将如何工作。 - Rutwick Gangurde
我要尝试一下,因为这可能是我现在唯一的解决方案!只有一个疑问,我对X_min/Y_min感到困惑,我的意思是我只有x、y值。什么是最小或最大值? - Rutwick Gangurde
我已更新我的回复,包括在您提出的特定示例中更相关的内容(三角计算以确定到最近点的垂直距离)。希望能有所帮助。 - varocarbas
我尝试使用引用系统,但无法理解全局变量x、y的含义。我将尝试您在最新更新中提到的三角函数方法。同时,我还添加了一张更新后的图片,我相信这是描述我所尝试的最简单的方式。非常抱歉给您带来这么多麻烦,感谢您的帮助! - Rutwick Gangurde
全局X/Y指的是包含carPic的内容;我猜在你的情况下,它是页面(0,0)的全局引用。很抱歉我之前表述得太笼统了,因为我不确定可能出现的变量情况。三角函数计算只是通用方法在你的案例中的应用,对你目前包括的所有示例都应该有效。 - varocarbas
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接