Вычисление центра вращения из матрицы преобразования Affine2D

У меня есть два 2D-изображения, второе из которых подвергается перемещению и вращению, в результате чего координаты (xn, yn) на первом изображении перемещаются в (xn', yn').

У меня нет проблем с получением угла поворота, перевода и коэффициента масштабирования из матрицы перевода, описанной ниже. Однако центр вращения не находится в центре изображения и находится довольно далеко от положения изображения. Возможно, я плохо справился с задачей изобразить проблему, но это выглядит так, как на прикрепленной картинке:

Вычисление центра вращения из матрицы преобразования Affine2D

Я пытаюсь найти центр вращения из матрицы преобразования, полученной из cv2.estimateAffinePartial2D, то есть ↓

s*cos(theta), -s*sin(theta), Tx
s*sin(theta),  s*cos(theta), Ty

где s — коэффициент масштабирования, theta — угол поворота, Tx и Ty — сдвиг по осям x и y соответственно.

Я попытался рассчитать это, решив уравнение ниже↓

Tx = (1-a)*Cx - b*Cy
Ty = b*Cx + (1-a)*Cy

где Cx и Cy — центр вращения и...

a = s*cos(theta)
b = s*sin(theta)

но я не уверен, что это правильно.

Я делаю это неправильно?

Уравнение для расчета центра вращения на основе матрицы преобразования, которую я привел выше.

РЕДАКТИРОВАНИЕ: (xn,yn) и (xn', yn') — это известные наборы координат, которые являются случайными точками внутри маленького синего прямоугольника, не обязательно в центре. Прошу прощения за отсутствие объяснений. Они похожи на [[x1,y1],[x2,y2]...[xn.yn]] и подобные точки, которые были перенесены и повернуты в [[x1',y1'],[x2',y2' ]...[xn',yn']].

Возможно, Ty = b*Cx + (1-a)*Cy — это Ty = - b*Cx + (1-a)*Cy (вам не хватает минуса). И кажется, что вы можете решить (Cx,Cy) напрямую из пары уравнений (Tx=... и Ty=...).

fana 01.04.2024 10:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
120
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что точки (xn, yn) и (xn', yn') известны.
Повторно используя имена переменных, вы получите правильное уравнение:

xn' = a.xn + b.yn  + (1-a)Cx -b.Cy + Tx
yn' = -b.xn + a.yn + b.Cx + (1-a)Cy + Ty

Как вы упомянули, все остальные параметры также известны, вам нужна только одна точка (может быть любая, если вы уверены, что это одна и та же точка на обоих изображениях) для решения Cx и Cy:

Cx = (xn' - a.xn - b.yn + b.Cy - Tx)/(1-a)
Cy = (yn' + b.xn - a.yn - b.Cx - Ty)/(1-a)

Этого должно быть достаточно, чтобы вычислить Cx и Cy.
Надеюсь это поможет!

Спасибо за ваш ответ. Я пробовал использовать разные точки, и кажется, что все время получаю разные результаты. В точках xn' и y' могут быть ошибки. Я мог бы усреднить их и вычислить стандартное отклонение позже.

ZeroX Al-Attas 01.04.2024 09:27

Зачем нужно значение точки данных? Преобразование определяется только параметрами. Поэтому, я думаю, (Cx, Cy) можно решить только с помощью параметров.

fana 01.04.2024 10:43

Точки (xn,yn) и их смещенные и повернутые точки (xn',yn') были взяты из результатов сопоставления (SIFT) двух изображений. Затем точки передаются в cv2.estimateAffinePartial2D для получения матрицы преобразования. Я думал, что центр вращения может находиться за пределами изображения, и хочу знать его координаты. Одна из возможностей заключается в том, что если центр вращения находится за пределами изображения (как показано на диаграмме), возможно, невозможно точно вычислить центр вращения?

ZeroX Al-Attas 04.04.2024 09:47
Ответ принят как подходящий

Аффинное преобразование – это

х' = (s * R) * х + Т

Кроме того, если центром вращения является C = (Cx,Cy), это преобразование будет записано как

x' = (s * R) * ( x - C ) + C

Итак, вы можете решить C из First_Equation = Second_Equation.
Это становится

Tx = (1-a)*Cx - b*Cy
Ty = - b*Cx + (1-a)*Cy

(с вашим определением a и b)

Другая точка является признаком только части -b * Cx.

Вы можете решить (Cx,Cy) из этих одновременных уравнений напрямую. Однако, похоже, вам следует позаботиться о том, чтобы 1-a и b могли быть нулевыми (для некоторых значений theta).


(Редактировать)
Я написал выше, возможно ошибаюсь:

После этого я еще раз проверил:

Frist_Equation = Second_Equation это

(s * R) * x + T = (s * R) * x + (s * R) * ( - C ) + C

удаляя термин { ( s * R ) * x } с обеих сторон, он становится

Т знак равно ( s * р ) * ( - C ) + C

По определению a и b это

[Tx] = [ a -b ][ -Cx ] + [ Cx ]
[Ty]   [ b  a ][ -Cy ]   [ Cy ]

Итак, наконец, это становится ниже, и я нашел свою ошибку.

Tx = (1-a)*Cx + b*Cy  // <-- Here, sign of b*Cy is different from I written above
Ty = - b*Cx + (1-a)*Cy

Спасибо за ответ. Возможно, я ошибаюсь, но знак для [-b * Cx] в данном случае противоположный, поскольку полученная матрица преобразования была [[ scos(theta), -ssin(theta), Tx],[ssin(theta), scos (тета), Ty]],,, а не [[scos(тета), ssin(тета), Tx],[-ssin(тета), scos(тета), Ty]].... Я попробовал [-b * Cx] и результаты оказались немного странными (хотя не исключаю, что это могло быть правдой). Я постараюсь подумать об этом еще немного.

ZeroX Al-Attas 04.04.2024 10:11

Возможно, я нашел свою ошибку. Возможно Tx = (1-a)*Cx - b*Cy неправильно, так и должно быть Tx = (1-a)*Cx + b*Cy

fana 04.04.2024 10:32

Спасибо за ваш ответ. Я попробовал уравнение, которое вы дали, но решение все равно неверное. Может быть, невозможно (или сложно) определить центр вращения, если (xn',yn') подвергается как вращению, так и перемещению от (xn, yn)? Я думал, что, возможно, (xn', yn') коррелирует как с перемещением (tx, ty), так и с углом поворота. Я новичок в этом, и я не могу понять эту проблему, которая выглядит и звучит просто.

ZeroX Al-Attas 08.04.2024 10:15

Спасибо! Решение, которое вы мне дали, было правильным с самого начала! У меня есть 2 проблемы с самого начала; (1) знак b был противоположным, как вы указали, и (2) я взял значения a и b непосредственно из матрицы преобразования, игнорируя мое собственное определение a = scos(theta) и b = ssin(theta). Большое спасибо! Дело закрыто :)

ZeroX Al-Attas 09.04.2024 04:45

Другие вопросы по теме