我的问题与另一个问题asked有关。但是在这里,我试图更精确地了解使用cv2.getAffineTransform获得的warp_matrix的组成。
我在this中发现了如何分解仿射变换矩阵,以及如何获得旋转 Angular 方法
但是当使用the OpenCV Doc中的示例时,我获得了两个不同的旋转 Angular 。
编码 :
import cv2
import numpy as np
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
theta0=np.degrees(np.arctan(-M[0,1]/M[0,0]))
theta1=np.degrees(np.arctan(M[1,0]/M[1,1]))
print(theta0)
print(theta1)
生产 :
-25.3461759419
-18.4349488229
最佳答案
相似变换(由缩放,旋转和平移的组合表示)是仿射变换的子集。仿射变换是任意2x3矩阵,因此不必分解为单独的缩放,旋转和变换矩阵。
如果您不希望进行仿射变换而是进行相似度变换以便可以进行分解,那么您将需要使用其他函数来计算相似度变换而不是仿射。
如果您使用的是OpenCV 3.2.0+(也包括4.0+),则可以使用 cv2.estimateAffinePartial2D()
(docs)。如果您使用的是先前版本,则可以使用 cv2.estimateRigidTransform()
(docs)。
根据estimateAffinePartial2D()
上的文档,估计的转换矩阵为
cos(θ) * s -sin(θ) * s t_x
sin(θ) * s cos(θ) * s t_y
其中
θ
是旋转 Angular ,s
是缩放因子,t_x
和t_y
分别是x,y轴上的平移。可以根据您链接的答案分解此处的结果。
>>> M, inliers = cv2.estimateAffinePartial2D(pts1, pts2)
>>> M
array([[ 1.26666667, 0.33333333, -70. ],
[ -0.33333333, 1.26666667, 53.33333333]])
您甚至可以在这里看到,前两列的对角线显然是相关的,因为它们应该旋转,但要仔细检查一下:
>>> theta0 = np.degrees(np.arctan2(-M[0,1], M[0,0]))
>>> theta1 = np.degrees(np.arctan2(M[1,0], M[1,1]))
>>> print(theta0)
-14.7435628365
>>> print(theta1)
-14.7435628365
请注意,answer you linked引用了另一个问题中的another answer。与我们在此处获得的矩阵和此处讨论的矩阵略有不同,在上面的版本中,只有一个比例因子
s
,但是在链接的版本中,存在两个比例因子s_x
和s_y
。有效地留下了五个自由度,即变量s_x, s_y, θ, t_x, t_y
相似变换具有四个自由度,而完全仿射变换具有六个自由度。我实际上不知 Prop 有五个自由度的类型是否是常用的类型?在我读过的图像拼接/摄影测量学文献中,我还没有看到它的讨论(尽管从数学上讲,它当然仍然是仿射变换的有效子集)。我只是指出这一点,因为我的答案与您链接的答案之间存在差异,但实际上,我认为您不会看到所使用的那种转换。
关于python - 仿射里面的东西(如何分解)warp_matrix,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54483794/