Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仿射扭曲矩阵的内部是什么(如何分解)_Python_Opencv_Cv2_Affinetransform - Fatal编程技术网

Python 仿射扭曲矩阵的内部是什么(如何分解)

Python 仿射扭曲矩阵的内部是什么(如何分解),python,opencv,cv2,affinetransform,Python,Opencv,Cv2,Affinetransform,我的问题与我想问的另一个问题有关。但在这里,我试图更精确地理解通过cv2.getAffineTransform获得的warp_矩阵的组成。 我发现了如何分解仿射变换矩阵,特别是如何得到旋转角度 但是当使用来自的例子时,我得到了两个不同的旋转角度 守则: import cv2 import numpy as np pts1 = np.float32([[50,50],[200,50],[50,200]]) pts2 = np.float32([[10,100],[200,50],[100,250

我的问题与我想问的另一个问题有关。但在这里,我试图更精确地理解通过cv2.getAffineTransform获得的warp_矩阵的组成。 我发现了如何分解仿射变换矩阵,特别是如何得到旋转角度

但是当使用来自的例子时,我得到了两个不同的旋转角度

守则:

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+),那么您可以使用。如果您使用的是以前的版本,则可以使用

根据
estimateAffinePartial2D()
上的文档,估计的变换矩阵为

cos(θ) * s   -sin(θ) * s    t_x
sin(θ) * s    cos(θ) * s    t_y
其中,
θ
是旋转角度,
s
是缩放因子,
t_x
t_y
分别是x轴和y轴上的平移

这里的结果可以根据您链接的答案进行分解

>M,inliers=cv2.估计仿射部分2d(pts1,pts2)
>>>M
数组([[1.26666667,0.33333333,-70.],
[ -0.33333333,   1.26666667,  53.33333333]])
您甚至可以在这里看到,前两列的对角线显然是相关的,因为它们应该用于旋转,但只是为了再次检查:

θ=np度(np.arctan2(-M[0,1],M[0,0])) >>>θ1=np度(np.arctan2(M[1,0],M[1,1])) >>>打印(θ0) -14.7435628365 >>>打印(θ1) -14.7435628365
请注意,参考文献来自不同的问题。与我们这里得到的矩阵和这里讨论的矩阵略有不同——在上面的版本中,只有一个比例因子
s
,但在链接的版本中,有两个比例因子,
s\u x
s\u y
。这实际上留下了五个自由度,即变量

s_x, s_y, θ, t_x, t_y
相似变换有四个自由度,完全仿射变换有六个自由度。我不知道五个自由度的类型是否是常用的类型;在我读过的图像拼接/摄影测量学文献中,我还没有看到对它的讨论(尽管从数学上讲,它仍然是仿射变换的一个有效子集)。我只是指出这一点,因为我的答案与您链接的答案之间存在差异,但在实践中,我认为您不会看到使用这种类型的转换