Перспективное преобразование точки в 2D-плоскости в Python - PullRequest
1 голос
/ 04 ноября 2019

У меня есть следующее изображение, на котором четыре угла корпуса скота - [(x1, y1), (x2, y2), (x3, y3), (x4, y4)]. Камера для захвата изображения была расположена в середине (x1, y1) и (x4, y4). Поскольку (x3, y3) и (x2, y2) находятся далеко от камеры, на изображении x1-x4 не равен x2-x3.

enter image description here

Мне нужно перепроектировать корпус в 2-мерную прямоугольную плоскость с углами [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] и маловероятно, что исходное изображение, этот новыйПлоскость будет иметь х1-х4 = х2-х3. Есть ли возможность сделать это? OpenCV поставляется с функцией преобразования перспективы, которая может применяться только к изображению. Но в этом случае у меня будет несколько x, y местоположений крупного рогатого скота на исходной плоскости, которые необходимо преобразовать и нарисовать в прямоугольной 2d плоскости, чтобы показать положение крупного рогатого скота.

1 Ответ

2 голосов
/ 04 ноября 2019

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

Прежде всего, нам нужно переопределить некоторые обозначения: например, вы использовали (x2, y2) для ссылки на обауказывает на размещенном изображении и на желаемое положение верхнего левого угла преобразованного изображения. Я упросту это, объявив преобразованные точки A = (x1, y2) и B = (x4, y3): мы растягиваем вершину трапеции по горизонтали, образуя прямоугольник.

Также обратите вниманиечто y1 = y4 и y2 = y3 с самого начала;это упрощает расчеты. Визуализируйте новые и старые изображения, наложенные внутри, с точкой вопроса Q, координаты которой отмечены на границе. Нам нужно найти общее уравнение для преобразованной точки Q, R, после "растяжения".

Я также отметил медиану исходного изображения, MN. Точки на этой линии не будут двигаться во время растяжения. Как примечание стороны, точки вдоль нижнего края 1-4 не будут двигаться. Точки на внешних краях 2-3 будут двигаться больше всего. Пусть C будет точкой на ребре 1-2 с той же координатой y, что и Q (и, позже, R);пусть D будет соответствующей точкой на MN.

A-----2-----M-----3---B
|                     |
Qy  CR  Q  D          |
|                     |
|                     |
1----Rx-Qx-N----------4

Нам просто нужно пропорционально оценить величину, на которую перемещается выбранная точка. Нахождение уравнений MN и 1-2 хорошо известно (двухточечная формула). Подставьте Qy в каждое из этих уравнений, чтобы получить Cx и Dx.

Коэффициент "растяжения" при преобразовании CD в (x1, Qy) D представляет собой отношение их длин: (Dx-x1) / (Dx-Cx),Q сместится влево на пропорцию этого коэффициента растяжения, в соответствии с расстоянием до D: (Dx-Qx) / (Dx-x1). Умножьте те, чтобы получить расстояние Q ходов. Вычтите эту сумму из Qx, чтобы получить Rx.

Да, теперь у вас есть несколько констант в конечном объединенном уравнении: x1, x2, x3, x4, y1, y2. У вас также есть переменные Qx и Qy. Это так и должно быть. Это оставляет вам общее уравнение для преобразования Qx => Rx для любой точки изображения.

Если вы планируете также растягиваться по вертикали, то же пропорции будут применяться в вертикальном направлении. Я предлагаю вам сделать один раз за раз;это сохранит модульность математики: легче проверять и отлаживать на отдельных этапах.

Это заставляет вас двигаться?

D не будет двигаться;

...