Что внутри (как разложить) аффинный warp_matrix - PullRequest
0 голосов
/ 01 февраля 2019

Мой вопрос связан с другим вопросом, который я задал .но здесь я пытаюсь более точно понять состав warp_matrix, полученный с помощью cv2.getAffineTransform.Я нашел в this , как разложить аффинную матрицу преобразования и, в частности, как получить угол поворота

Но при использовании примера из 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

1 Ответ

0 голосов
/ 02 февраля 2019

Преобразования подобия (которые представлены комбинацией масштабирования, поворота и перевода) являются подмножеством аффинных преобразований.Аффинные преобразования являются произвольными матрицами 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

Преобразование подобия имеет четыре степеней свободы, а полное аффинное преобразование имеет шесть .Я на самом деле не знаю, является ли тип с пятью степенями свободы широко распространенным;Я не видел, чтобы это обсуждалось в литературе по сшивке изображений / фотограмметрии, которую я читал (хотя математически это, конечно, все еще действительный набор аффинных преобразований).Я просто указываю на это, так как это несоответствие между моим ответом и тем, который вы связали, но на практике я не думаю, что вы увидите такой тип используемого преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...