2017-01-05 19 views
0

enter image description hereПолучить двумерный линейное пространство по форме трапеции внутри кадра изображения

В этом изображении, черный кадр является кадром изображения, а трапеция представляет собой прямоугольная плоскость, как показана с помощью камеры.

Я знаю координату пикселя из 4 углов и могу проходить через каждый пиксель внутри этой трапеции. Поскольку я не знаю/не могу знать векторы преобразования/вращения от камеры к плоскости, я бы хотел преобразовать пиксели в координаты [0,0] [1,1] в соответствии с положением внутри этой трапеции, так что я выбираю точку внутри трапеции и получить некоторые координаты в диапазоне [0, 0] [1, 1].

По линейному пространству я имею в виду создание ряда значений, которые варьируются от 0 до 1 линейно. Таким образом, одномерное линейное пространство от 0 до 1 на 100 шагов будет выглядеть как [0, 0.01, 0.02, 0.03 ... 1]. В этом случае я хотел бы сделать это, но в двух измерениях в трапеции. Если бы это был прямоугольник, это было бы тривиально, я не уверен, что есть способ сделать это для трапеции.

Например, каждая точка в линии левой стороны трапеции всегда будет X = 0, а y переходит от 0 до 1 линейно при перемещении вверх (хотя X-координата фактически изменяется в кадре изображения) ,

+1

Взгляните на [барицентрических координаты для выпуклых четырехугольников] (HTTP: // stackoverflow.com/q/3154041/3426025) – BeyelerStudios

+0

Или вы можете пройти через однородные координаты, как в ответах [здесь] (http://stackoverflow.com/q/10839998/3426025) – BeyelerStudios

+0

Я думаю, что это больше похоже на , http://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle –

ответ

1

Я сделал пример в Javascript here. Ниже приводится объяснение математики, стоящей за ней.

Имя точки, по часовой стрелке, начиная с (0, 0), А, В, С, D. Тогда мы можем определить точку вдоль левой стороны, Q, в виде линейной комбинации А и В:

Qx = Ax * (1 - v) + Bx * v 
Qy = Ay * (1 - v) + By * v 

Или

Qx = Ax + dx1 * v 
Qy = Ay + dy1 * v 

Где dx1 = Bx - Ax и dy1 = By - Ay

и точка вдоль правой стороны, R в виде линейной комбинации D и C:

Rx = Dx + dx2 * v 
Ry = Dy + dy2 * v 

Где dx2 = Cx - Dx и dy2 = Cy - Dy

Затем мы можем провести линию от Q к R. С V = 0, мы имеем линию AD с V = 1, мы имеем линию BC. Поскольку v идет от 0 до 1, мы получаем линии, которые покрывают всю трапецию (при условии, что она выпукла).

Таким образом, любая точка P внутри трапеции может быть линейной комбинацией Q и R:

Px = Qx * (1 - u) + Rx * u 
Py = Qy * (1 - u) + Ry * u 

Так точка (Px, Py) можно записать:

Px = (Ax + dx1 * v) * (1 - u) + (Dx + dx2 * v) * u 
Py = (Ay + dy1 * v) * (1 - u) + (Dy + dy2 * v) * u 

Теперь мы имеем два уравнения в два неизвестные.

Расширение и собирать v сек

v = (Px - Ax + u.Ax - u.Dx)/(dx1 - u.dx1 + u.dx2) 
v = (Py - Ay + u.Ay - u.Dy)/(dy1 - u.dy1 + u.dy2) 

Еще несколько замен, чтобы упростить расчеты:

dx3 = Ax - Dx 
dy3 = Ay - Dy 
dx4 = dx2 - dx1 
dy4 = dy2 - dy1 
dx5 = Px - Ax 
dy5 = Py - Ay 

Чтобы получить:

v = (dx5 + u.dx3)/(dx1 + u.dx4) 
v = (dy5 + u.dy3)/(dy1 + u.dy4) 

Установить им равный

(dx5 + u.dx3)/(dx1 + u.dx4) = (dy5 + u.dy3)/(dy1 + u.dy4) 

Крест многократно

(dx5 + u.dx3) * (dy1 + u.dy4) = (dy5 + u.dy3) * (dx1 + u.dx4) 

Expand

dx5 * dy1 + dx5 * dy4 * u + dx3 * dy1 * u + dx3 * dy4 * u^2 = dy5 * da1 + dy5 * dx4 * u + dy3 * dx1 * u + dy3 * dx4 * u^2 

соберем члены

(dx3 * dy4 - dy3 * dx4)u^2 + (dx5 * dy4 - dy5 * dx4 + dx3 * dy1 - dy3 * dx1)u + dx5 * dy1 - dy5 * dx1 = 0 

Это является квадратичной формы ax^2 + bx + c = 0 решить с помощью квадратичной формулы

a = dx3 * dy4 - dy3 * dx4 
b = dx5 * dy4 - dy5 * dx4 + dx3 * dy1 - dy3 * dx1 
c = dx5 * dy1 - dy5 * dx1; 
determinant = b * b - 4 * a * c 

Если определитель> = 0

u = (-B + sqrt(determinant))/(2 * A) 

u Затем вставьте обратно в это уравнение, чтобы получить v:

v = (dx5 + u.dx3)/(dx1 + u.dx4)