如何从cv2.estimateAffinePartial2D的Affine2D变换矩阵计算旋转中心?
问题解答
你的推导存在错误,错误出在Ty对应的方程上。下面是正确的推导过程和求解旋转中心的方法:
1. 仿射变换与旋转中心的关系
你得到的仿射变换矩阵对应的变换式为:
x' = a*x - b*y + Tx y' = b*x + a*y + Ty
其中 a = s*cosθ,b = s*sinθ,s 是缩放因子,θ 是旋转角,Tx、Ty 是矩阵中的平移项。
而绕旋转中心 (Cx, Cy) 的旋转+缩放变换(无额外平移)的展开式为:
x' = a*(x - Cx) - b*(y - Cy) + Cx y' = b*(x - Cx) + a*(y - Cy) + Cy
将该式展开并与你得到的仿射变换式对比,可推导出旋转中心 (Cx, Cy) 需满足的正确方程组:
Tx = (1 - a)*Cx + b*Cy Ty = -b*Cx + (1 - a)*Cy
2. 旋转中心的求解公式
将上述方程组整理为线性方程组形式,用克莱姆法则可直接解出 Cx 和 Cy:
首先计算系数矩阵的行列式:
D = (1 - a)² + b²
然后代入求解:
Cx = [ Tx*(1 - a) - Ty*b ] / D Cy = [ Ty*(1 - a) + Tx*b ] / D
3. 利用多组对应点优化求解
由于你已知多组对应点 (xn, yn) 和 (xn', yn'),可以直接通过这些点构建方程,用最小二乘法求解旋转中心,结果会更鲁棒:
对每组对应点,变换满足:
xn' - Cx = a*(xn - Cx) - b*(yn - Cy) yn' - Cy = b*(xn - Cx) + a*(yn - Cy)
整理为关于 Cx、Cy 的线性方程:
(1 - a)*Cx + b*Cy = xn' - a*xn + b*yn -b*Cx + (1 - a)*Cy = yn' - b*xn - a*yn
将所有点的方程组合,用最小二乘法求解即可得到最优的 Cx 和 Cy。
内容的提问来源于stack exchange,提问作者ZeroX Al-Attas
相关产品推荐
相关产品推荐

