从Affine2D变换矩阵计算旋转中心

0 投票
2 回答
50 浏览
提问于 2025-04-12 07:09

我有两张二维图像,第二张图经过平移和旋转,导致第一张图中的坐标 (xn, yn) 移动到了 (xn', yn')。

我能很容易地从下面描述的变换矩阵中得到旋转角度、平移和缩放因子。不过,旋转的中心并不在图像的中心,而且离图像的位置相当远。

我可能在尝试描述这个问题时做得不好,但它看起来像附上的图片:

附上的图片

我正在尝试从通过 cv2.estimateAffinePartial2D 得到的变换矩阵中找出旋转中心,变换矩阵如下所示↓

s*cos(theta), -s*sin(theta), Tx
s*sin(theta),  s*cos(theta), Ty

其中 s 是缩放因子,theta 是旋转角度,TxTy 分别是 x 轴和 y 轴的平移。

我尝试通过下面的方程来计算旋转中心↓

Tx = (1-a)*Cx - b*Cy
Ty = b*Cx + (1-a)*Cy

其中 CxCy 是旋转中心,...

a = s*cos(theta)
b = s*sin(theta)

但我不确定这样做是否正确。

我这样做是错的吗?

这是从我上面给出的变换矩阵计算旋转中心的方程。

补充说明: (xn, yn) 和 (xn', yn') 是已知的坐标集,这些都是小蓝色矩形内的随机点,不一定是中心。我为缺乏解释感到抱歉。它们像是 [[x1,y1],[x2,y2]...[xn,yn]],以及类似的点,这些点经过平移和旋转变成了 [[x1',y1'],[x2',y2']...[xn',yn']]。

2 个回答

0

我假设你已经知道了点 (xn, yn) 和 (xn', yn') 的位置。
通过重复使用你的变量名,你要找的正确公式是:

xn' = a.xn + b.yn  + (1-a)Cx -b.Cy + Tx
yn' = -b.xn + a.yn + b.Cx + (1-a)Cy + Ty

正如你提到的,其他所有参数也都是已知的,你只需要一个点(可以是任意一个,只要你确定这两个图像上的点是同一个)来计算 CxCy

Cx = (xn' - a.xn - b.yn + b.Cy - Tx)/(1-a)
Cy = (yn' + b.xn - a.yn - b.Cx - Ty)/(1-a)

这应该足够用来计算 CxCy
希望这对你有帮助!

撰写回答