Преобразование четырехугольника в прямоугольник - PullRequest
2 голосов
/ 08 июня 2011

Я хочу преобразовать четырехугольное изображение в прямоугольное изображение, которое я знаю по тем вершинам.Например, на изображении ниже я знаю координаты (X1, Y1) ~ (X4, Y4) и (x1, y1) ~ (x2, y2) и хочу преобразовать их в прямоугольник.как получить координату (x, y) в прямоугольном изображении, которая соответствует координате (X, Y) в четырехугольном изображении?

 ____> Y             ____> y            
|                   |                               
|                   |    
V                   V
X                   x               

(X1,Y1)   (X2,Y2)        (x1,y1)    (x1,y2)
    ________                 _________
   / .(X,Y) \   =>          |  .(x,y) |
  /__________\              |_________|
(X3,Y3)    (X4,Y4)       (x2,y1)    (x2,y2) 

1 Ответ

0 голосов
/ 08 июня 2011

Если предполагается, что это перспективная трансформация, вы ищете термин гомография . Может быть, Matlab в этих ссылках работает так, как вы хотите:

http://www.csse.uwa.edu.au/~pk/research/matlabfns/#projective

http://www.robots.ox.ac.uk/~vgg/hzbook/code/

Отредактировано после комментариев: Итак, я решил уравнения с Mathematica. Если вы определите (для удобства чтения)

M=(x-x1)/(x2-x1)

и

N=(y-y1)/(y2-y1),

тогда пара решений довольно громоздкая

{M -> -(X1 Y - X3 Y + X4 Y - X Y1 - X4 Y1 + X Y2 - 2 X1 Y2 + X3 Y2 + 
   X Y3 - X2 (Y - 2 Y1 + Y3) - X Y4 + 
   X1 Y4 + \[Sqrt](4 (X3 (-Y + Y1) + X1 (Y - Y3) + 
         X (-Y1 + Y3)) (-(X3 - X4) (Y1 - Y2) + (X1 - X2) (Y3 - 
            Y4)) + (X4 (-Y + Y1) + X3 (Y - 2 Y1 + Y2) + 
        X2 (Y - Y3) - X1 (Y - 2 Y3 + Y4) + 
        X (Y1 - Y2 - Y3 + Y4))^2))/(2 (-(X2 - X4) (Y1 - 
        Y3) + (X1 - X3) (Y2 - Y4))), 
N -> -(-X2 Y - X3 Y + X4 Y - X Y1 + 2 X3 Y1 - X4 Y1 + X Y2 - X3 Y2 +
    X Y3 + X2 Y3 - X Y4 + 
   X1 (Y - 2 Y3 + 
      Y4) - \[Sqrt](4 (X3 (-Y + Y1) + X1 (Y - Y3) + 
         X (-Y1 + Y3)) (-(X3 - X4) (Y1 - Y2) + (X1 - X2) (Y3 - 
            Y4)) + (X4 (-Y + Y1) + X3 (Y - 2 Y1 + Y2) + 
        X2 (Y - Y3) - X1 (Y - 2 Y3 + Y4) + 
        X (Y1 - Y2 - Y3 + Y4))^2))/(2 (-(X3 - X4) (Y1 - 
        Y2) + (X1 - X2) (Y3 - Y4)))} 

и

{M -> -(X1 Y - X3 Y + X4 Y - X Y1 - X4 Y1 + X Y2 - 2 X1 Y2 + X3 Y2 + 
   X Y3 - X2 (Y - 2 Y1 + Y3) - X Y4 + 
   X1 Y4 - \[Sqrt](4 (X3 (-Y + Y1) + X1 (Y - Y3) + 
         X (-Y1 + Y3)) (-(X3 - X4) (Y1 - Y2) + (X1 - X2) (Y3 - 
            Y4)) + (X4 (-Y + Y1) + X3 (Y - 2 Y1 + Y2) + 
        X2 (Y - Y3) - X1 (Y - 2 Y3 + Y4) + 
        X (Y1 - Y2 - Y3 + Y4))^2))/(2 (-(X2 - X4) (Y1 - 
        Y3) + (X1 - X3) (Y2 - Y4))), 
N -> -(-X2 Y - X3 Y + X4 Y - X Y1 + 2 X3 Y1 - X4 Y1 + X Y2 - X3 Y2 +
    X Y3 + X2 Y3 - X Y4 + 
   X1 (Y - 2 Y3 + 
      Y4) + \[Sqrt](4 (X3 (-Y + Y1) + X1 (Y - Y3) + 
         X (-Y1 + Y3)) (-(X3 - X4) (Y1 - Y2) + (X1 - X2) (Y3 - 
            Y4)) + (X4 (-Y + Y1) + X3 (Y - 2 Y1 + Y2) + 
        X2 (Y - Y3) - X1 (Y - 2 Y3 + Y4) + 
        X (Y1 - Y2 - Y3 + Y4))^2))/(2 (-(X3 - X4) (Y1 - 
        Y2) + (X1 - X2) (Y3 - Y4)))}

Обратите внимание, что единственная разница - знак перед Srqt.

Теперь вам нужно только заново сформировать определения M и N выше, чтобы получить x, y. x=M*(x2-x1)+x1, y=N*(y2-y1)+y1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...