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

Я пытаюсь найти центр вращения из матрицы преобразования, полученной из 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']].






Я предполагаю, что точки (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' могут быть ошибки. Я мог бы усреднить их и вычислить стандартное отклонение позже.
Зачем нужно значение точки данных? Преобразование определяется только параметрами. Поэтому, я думаю, (Cx, Cy) можно решить только с помощью параметров.
Точки (xn,yn) и их смещенные и повернутые точки (xn',yn') были взяты из результатов сопоставления (SIFT) двух изображений. Затем точки передаются в cv2.estimateAffinePartial2D для получения матрицы преобразования. Я думал, что центр вращения может находиться за пределами изображения, и хочу знать его координаты. Одна из возможностей заключается в том, что если центр вращения находится за пределами изображения (как показано на диаграмме), возможно, невозможно точно вычислить центр вращения?
Аффинное преобразование – это
х' = (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] и результаты оказались немного странными (хотя не исключаю, что это могло быть правдой). Я постараюсь подумать об этом еще немного.
Возможно, я нашел свою ошибку. Возможно Tx = (1-a)*Cx - b*Cy неправильно, так и должно быть Tx = (1-a)*Cx + b*Cy
Спасибо за ваш ответ. Я попробовал уравнение, которое вы дали, но решение все равно неверное. Может быть, невозможно (или сложно) определить центр вращения, если (xn',yn') подвергается как вращению, так и перемещению от (xn, yn)? Я думал, что, возможно, (xn', yn') коррелирует как с перемещением (tx, ty), так и с углом поворота. Я новичок в этом, и я не могу понять эту проблему, которая выглядит и звучит просто.
Спасибо! Решение, которое вы мне дали, было правильным с самого начала! У меня есть 2 проблемы с самого начала; (1) знак b был противоположным, как вы указали, и (2) я взял значения a и b непосредственно из матрицы преобразования, игнорируя мое собственное определение a = scos(theta) и b = ssin(theta). Большое спасибо! Дело закрыто :)
Возможно,
Ty = b*Cx + (1-a)*Cy— этоTy = - b*Cx + (1-a)*Cy(вам не хватает минуса). И кажется, что вы можете решить (Cx,Cy) напрямую из пары уравнений (Tx=... и Ty=...).