MATLAB рассчитать угол поворота
У меня 5 очков по кругу:.......... 1
............................................ 2........ 3
4 5
Теперь у меня есть его повернутое изображение:.............
............................................................. 1........ 3
2 5
4
Примечание: точки не нумеруются.
У меня в основном есть 5 наборов координат, которые при построении выглядят как на рисунке ниже.
Мне нужно рассчитать величину, на которую я должен наклонить изображение, чтобы оно выглядело как на изображении выше.
3 ответа
Если у вас есть координаты точек, вы можете попытаться минимизировать ошибку, определив соответствующий функционал ошибки, который зависит от угла и смещения.
Эта проблема становится решаемой линейным методом наименьших квадратов, если у вас также есть масштаб в вашем преобразовании. В этом случае решение в Matlab легко:
Пусть x,y будут вашими исходными точками, а xt,yt результирующими точками.
tform = cp2tform([x,y],[xt,yt],'linear conformal');
Это преобразование может быть применено к изображению, используя imtransform
Если ваша модель не имеет масштаба, и она только вращается и сдвигается, вы можете найти приближенное решение по следующим уравнениям наименьших квадратов:
( x1 y1 1 0) (x1t)
(-y1 x1 0 1) (y1t)
( x2 y2 1 0) (x2t)
(-y2 x2 0 1) * ( cos(theta) ) (y1t)
... ( sin(theta) ) =
... ( xc )
... ( yc )
(xn yn 1 0)
(-yn xn 0 1) (ynt)
Очевидно, вы не можете заставить cos(тэта) и sin(тэта) иметь одинаковую тэту, поэтому решение является приблизительным. Может служить исходным решением и уточняться методом градиентного спуска.
Если у вас есть доступ к панели инструментов статистики, я думаю, procrustes
Команда может сделать то, что вам нужно. Учитывая два набора точек, он находит наилучшее (с точки зрения суммы квадратов ошибок) линейное преобразование (перемещение, отражение, ортогональное вращение и масштабирование) точек в одной, чтобы согласовать их с точками в другой.
Вы можете подавить компоненты масштабирования и отражения, используя дополнительные входные данные для команды. Если вы переведете оба набора в общий источник до применения команды, вы также подавите компонент перевода и останетесь только с поворотом.
Если я правильно понял ваш вопрос, это проблема абсолютной ориентации. Вы можете найти несколько решений для этого (например, решение Хорна с использованием кватернионов). Подобный вопрос можно найти здесь.