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 Команда может сделать то, что вам нужно. Учитывая два набора точек, он находит наилучшее (с точки зрения суммы квадратов ошибок) линейное преобразование (перемещение, отражение, ортогональное вращение и масштабирование) точек в одной, чтобы согласовать их с точками в другой.

Вы можете подавить компоненты масштабирования и отражения, используя дополнительные входные данные для команды. Если вы переведете оба набора в общий источник до применения команды, вы также подавите компонент перевода и останетесь только с поворотом.

Если я правильно понял ваш вопрос, это проблема абсолютной ориентации. Вы можете найти несколько решений для этого (например, решение Хорна с использованием кватернионов). Подобный вопрос можно найти здесь.

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