Превратить четырехугольник в прямоугольник? - PullRequest
8 голосов
/ 07 июля 2010

У меня есть сцена, состоящая из одного произвольного четырехугольника. Мне нужно иметь возможность превратить этот четырехугольник в прямоугольник. Каждый квад находится в двухмерных координатах, поэтому они имеют 4 вершины (x_i, y_i).

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

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

Ответы [ 3 ]

12 голосов
/ 07 июля 2010

Знаете ли вы, каков размер желаемого прямоугольника?Вы можете отобразить любой выпуклый четырехугольник на прямоугольник с обратимым преобразованием с перспективным преобразованием, если это так.Все, что вам нужно сделать, это получить 4 соответствующие точки (между четырехугольником и прямоугольником), скажем, (X 1 , Y 1 ), (X 2 , Y 2 ), (X 3 , Y 3 ), (X 4 , Y 4 )для четырехугольника и соответственно (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ), (x 4 , y 4 ) для прямоугольника.Затем включите его в окончательное уравнение в ссылку Бореалида , и вы установите:

alt text

Решение вышеприведенного уравнения (где n = 4) будетдать вам элементы (a, b, c, d, e, ..., h) матрицы обратимого преобразования перспективы,

alt text

Это позволит вам преобразоватьуказывает на прямоугольник к точкам на четырехугольнике.Для обратного преобразования просто инвертируйте матрицу преобразования.

Также обратите внимание, что как только вы получите вектор [XW YW W] T преобразованных координат, вам нужно его нормализовать так, чтобы W = 1. Т.е. ваш окончательный ответ был [XW /W YW / WW / W] T , что равно [XY 1] T , требуемый ответ.

1 голос
/ 07 июля 2010

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

Однако вы можете создать обратимое преобразование для определенного четырехугольника.Как вы предполагаете, речь идет о повороте перспективы, поэтому четырехугольник «выглядит» как прямоугольник в вашем новом координатном пространстве.См. http://alumni.media.mit.edu/~cwren/interpolator/, который содержит исходный код Matlab для этой проблемы.

0 голосов
/ 28 декабря 2012

В этом решении используется API JAI (Java Advance Image) вся магия в методе QuadToQuad. Вот пример кода.

try
     {
      BufferedImage img = UtilImageIO.loadImage(picName);
      ParameterBlock params = new ParameterBlock();
      params.addSource(img); //source is the input image
        int w = img.getWidth(); //Set to the original width of the image
        int h = img.getHeight(); //Set to the original height of image
        Point tl = new Point(x,y); //The new top left corner
        Point tr = new Point((x1,y1); //The new top right corner
        Point bl = new Point(x2,y2); //The new bottom left corner
        Point br = new Point(x3,y3); //The new bottom right corner
        PerspectiveTransform p = PerspectiveTransform.getQuadToQuad(0,0, 0, h, w, h, w, 0, tl.x, tl.y, bl.x, bl.y, br.x, br.y, tr.x, tr.y).createInverse();
        WarpPerspective wa = new WarpPerspective(p);
        params.add(wa);
        params.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC)); //Change the interpolation if you need more speed
        RenderedOp dest = JAI.create("warp", params); //dest is now the output
        File outputfile = new File(picName);
        ImageIO.write(dest, "jpg", outputfile); 

    }
    catch(Exception e){}

Надеюсь, это поможет вам. :)

...