python - 仿射 warp_matrix 里面有什么(如何分解)

标签 python opencv cv2 affinetransform

我的问题与我的另一个问题相关 asked 。但在这里我试图更准确地理解使用 cv2.getAffineTransform 获得的 warp_matrix 的组成。 我在 this 中找到如何分解仿射变换矩阵,特别是如何获得旋转角度

但是当使用 the OpenCV Doc 中的示例时我获得两个不同的旋转角度。

代码:

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

其中,θ 是旋转角度,s 是缩放因子,t_xt_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_xs_y。这实际上留下了五个自由度,即变量

s_x, s_y, θ, t_x, t_y

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

关于python - 仿射 warp_matrix 里面有什么(如何分解),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54483794/

相关文章:

python - 是否可以缓存 python suds 客户端?

python - 在 python 列表类型结构中合理存储 10 亿多个值

python - 打开cv2 python乘法图像

python - 我如何导入cv2

python - 使用Python模块BeautifulSoup抓取XML,需要树中的特定标签

python - 在python中,你如何检查一个字符串是否同时包含大写和小写字母

opencv - 找不到依赖库javacv

python - 如何使用 morphologyEx 和 drawContours 检测空的公园空间?

python - 使用 MoviePy 修复未最终的 .flv 视频

python - 通过边缘校正波浪图像