Первоначально это было опубликовано как вопрос программирования, поэтому я постараюсь сохранить его как можно более абстрактным.
Мы имеем дело с двумя изображениями. Первый - оригинал, а второй - искаженная версия оригинала. Образцы изображений прилагаются.
В оригинале один квадрат (маркер) нарисован слева вверху, один справа вверху и один справа внизу. Три квадрата используются для определения ориентации. Мы знаем , изображения и координаты всех трех маркеров. Так же есть интерес на изображение, чье позицию мы знаем.
К искаженной версии применены некоторые преобразования (только перемещение, масштабирование и вращение). Это очень распространено, если документ/изображение печатается и сканируется обратно в систему. Он может быть даже перевернутым, перекошенным и т. д., но пока давайте проигнорируем это и предположим, что даже поворот не более 15 градусов.
Теперь я могу обнаружить
координаты всех маркеров и рассчитать угол поворота, количество
перевод и
коэффициент масштабирования.
Теперь я могу обнаружить координаты всех маркеров для трансформированного изображения и нужно вычислить преобразованное :
где
Здесь есть два разных вопроса:
Как поясняется в комментариях, рассматриваемые преобразования составляют все преобразования подобия плоскости. Любое такое преобразование может быть записано как произведение , где это перевод, это вращение и является однородным скейлингом. В координатах это
Я предполагаю, что соотношение сторон изображения таково, что повороты до не может наклонять диагональ дальше горизонтали или вертикали, то есть маркеры сверху остаются наверху, а маркеры справа остаются справа. Если нет, вам, возможно, придется сначала выполнить некоторые дополнительные тесты, чтобы правильно идентифицировать маркеры.
Угол поворота можно извлечь из верхних маркеров: , где - координаты верхнего левого маркера и координаты верхнего правого маркера. (Это предполагает, что маркеры изначально имеют одинаковые координата; если нет, вам нужно вычесть соответствующий угол, рассчитанный из исходных координат.)
Коэффициент масштабирования можно определить по изменению расстояния между любыми двумя маркерами, скажем, верхними маркерами: , где и являются оригинальными координаты верхних маркеров. (Опять же это предполагает, что их первоначальный координаты равны; в противном случае знаменатель представляет собой квадратный корень, аналогичный числителю.)
Теперь перевод можно определить по любому маркеру, скажем, по верхнему левому маркеру:
Тогда вам просто нужно применить уравнение преобразования к преобразовать его.
Рахил Хан
йорики
йорики