我将旋转图像上的点的x,y坐标按特定角度。我想在原始的非旋转图像中找到同一点的坐标。
请检查第一张更简单的图片:
更新的图片,已简化:
旧图片
答案 0 :(得分: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.
答案 1 :(得分:0)
首先要做的是定义参考系统(“每个图像的点位置”将如何转换为数字)。我想你想依靠一个基本的二维参考系统,由一个点(几个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)
-----------------更新公式与新车PIC相关
RefX_old = min旋转前CarFrame的X值。
RefY_old =旋转前CarFrame的最大Y值。
RefX_new = min旋转后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具有相同的坐标) ,但就全球框架而言是不同的。)
以这种方式看似有点复杂;但它真的很简单。您只需要仔细考虑一个案例并创建执行所有操作的算法。这个想法非常简单:如果我在8岁以内的东西,从5开始;我对容器的态度是3。
------------方法学更新
如评论中所述,这些最后的图片证明了最初提出的参考计算(最大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给出从点到汽车框架最近侧(分别为左侧和底侧)的垂直距离。通过应用这些公式(我坚持:仔细分析它们),你得到X_old_D_absolute_frame / Y_old_D_absolute_frame,你只需要添加carFrame中的lef / bottom值(如果它位于0,0,那么这将是最终的值)。