Преобразования подобия (которые представлены комбинацией масштабирования, поворота и перевода) являются подмножеством аффинных преобразований.Аффинные преобразования являются произвольными матрицами 2x3 и, как таковые, не должны разлагаться на отдельные матрицы масштабирования, вращения и преобразования.
Если вы не хотите иметь аффинное преобразование, а преобразование подобия, чтобы вы могли выполнить эту декомпозицию, тогда вам нужно будет использовать другую функцию для вычисления преобразований подобия вместо аффинного.
Если вы используете OpenCV 3.2.0+ (включая 4.0+), вы можете использовать cv2.estimateAffinePartial2D()
(документы) .Если вы используете предыдущую версию, вы можете использовать cv2.estimateRigidTransform()
(документы) .
Из документов на estimateAffinePartial2D()
оценочная матрица преобразования составляет
cos(θ) * s -sin(θ) * s t_x
sin(θ) * s cos(θ) * s t_y
Где θ
- угол поворота, 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
Обратите внимание, что ответ, который вы связали ссылки другой ответ из другого вопроса.Есть небольшая разница с матрицей, которую мы здесь получили, и с матрицей, которая обсуждалась там - в приведенной выше версии есть только один масштабный коэффициент s
, но в связанной версии есть два масштабных коэффициента, s_x
и s_y
.Это фактически оставляет пять степеней свободы, а именно переменные
s_x, s_y, θ, t_x, t_y
Преобразование подобия имеет четыре степеней свободы, а полное аффинное преобразование имеет шесть .Я на самом деле не знаю, является ли тип с пятью степенями свободы широко распространенным;Я не видел, чтобы это обсуждалось в литературе по сшивке изображений / фотограмметрии, которую я читал (хотя математически это, конечно, все еще действительный набор аффинных преобразований).Я просто указываю на это, так как это несоответствие между моим ответом и тем, который вы связали, но на практике я не думаю, что вы увидите такой тип используемого преобразования.