Задать вопрос
@choupa
Архитектор (обычный, который строит)

Как найти линейное преобразование плоскости?

Есть два изображения плоского предмета (например книга). Найден набор нумерованных ключевых точек на обоих фото. Установлено их соответствие. Требуется найти линейное преобразование (масштаб, поворот, перспектива) от одного фото к другому.

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

Но дело в том, что такие четвёрки можно выбрать множеством способов, и решения систем будет немного различаться (в силу неточности координат распознанных ключевых точек). Т.е. есть избыточное количество конкурирующих систем линейных уравнений.

Не могу придумать как быстро получить параметры наилучшего преобразования. Перебор всех вариантов формирования четвёрток — не реален, да и понятно, что это в целом плохой путь. А как быть?

Критерий наилучшести — минимум суммы среднеквадратичных отклонений образов всех точек первого фото от фактических точек второго фото.
  • Вопрос задан
  • 178 просмотров
Подписаться 3 Сложный 4 комментария
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Вот здесь всё, касательно ответа на вопрос.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Griboks
@Griboks
По любой четвёрке находим ориентировочное решение. Далее, задав точность, применяем найденное решение с поправкой на +-delta. Находим наиболее оптимальное дельта по указанному критерию.

Поясню:
1) нашли афинное преобразование: +10 - сдвиг всех точек на 10 вправо
2) задаём точность: 0,01
3) в цикле оцениваем ваш критерий для всех сдвигов вправо от 5 до 15 с шагом 0,01
4) выбираем лучший сдвиг
Ответ написан
@Karpion
У Вас в задаче заложен ответ!

Пусть координаты точек первой картинки = P[i], второй = V[i] (каждая координата = вектор с двумя значениями).

Далее надо записать линейное преобразование:
P[i] -> A + B*P[i]
(A и B тоже имеют по две компоненты; A = вообще нормальный обычный вектор).

Ищем разницу, возводим в квадрат:
(A + B*P[i] - V[i])^2
суммируем это по i (по всем точкам).

Теперь берём четыре частные производные по каждой компоненте A и B, приравниваем их к нулю. Получаем четыре линейных уравнения.
Ну а решать линейные уравнения - должен уметь всякий.

Upd1: Что такое "перспектива" - я не понял. Наклон фотоаппарата, что ли?
Если B - это одна компонента, то алгоритм остаётся прежний.

Upd2: Если надо учитывать ещё и возможность поворота на определённый угол - будет сложнее; но преобразование всё равно линейное.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы