квадрат к трапеции - PullRequest
10 голосов
/ 28 мая 2011

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

Использование проективной матрицы для перевода, масштабирования, вращения и сдвига является простым. Существует ли простая проективная матрица, которая преобразует квадрат в трапецию?

Ответы [ 3 ]

11 голосов
/ 02 июля 2011

a, b, c, d - четыре угла вашего 2D квадрата.

a, b, c, d выражены в однородной координате, поэтому они представляют собой матрицы 3x1.

альфа, бета, гамма, дельта - четыре угла вашей 2D трапеции.

альфа, бета, гамма, дельта выражаются в однородной координате, поэтому они представляют собой матрицы 3x1.

H - это матрица 3x3, которую вы ищете, она также называется гомографией

    h1 h2 h3
H = h4 h5 h6
    h7 h8 h9

H отображает a, b, c, d в альфа, бета, гамма, дельта, и поэтому у вас есть следующие четыре уравнения

alpha=H*a
beta=H*b
gamma=H*c
delta=H*d

Предполагая, что вы знаете a, b, c, d и альфа, бета, гамма, дельта, вы можете решить предыдущую систему четырех уравнений для девяти неизвестных h1, h2, h3, h4, h5, h6, h7, h8, h9 ,

Здесь я только что описал «сырое» решение проблемы, которое в принципе может работать; для подробного объяснения вышеупомянутого метода вы можете увидеть, например, эту страницу http://www.corrmap.com/features/homography_transformation.php, где они помещают h9=1 (поскольку H может быть выражено только с 8 параметрами), а затем решите линейную систему из восьми уравнений в восьми неизвестных. Вы можете найти аналогичное объяснение в разделе 2 тезиса Оценка гомографии Элана Дуброфски .

Другое объяснение: Использование проекционной геометрии для коррекции камеры Дэвид Остин в мартовском выпуске 2013 года Колонка функций из AMS .

Вышеупомянутый метод с его недостатками описан в главе 4 «Оценка - 2D проективное преобразование» во втором издании Геометрия множественного обзора в компьютерном зрении Ричарда Хартли и Эндрю Циссерманна, где они также описать разные и лучшие алгоритмы; Вы можете проверить эту ссылку http://www.cse.iitd.ac.in/~suban/vision/geometry/node24.html, которая, кажется, следует той же книге.

Вы можете найти другое объяснение гомографии в разделе 15.1.4, «Модель проективного преобразования» книги Компьютерное зрение: модели, обучение и умозаключение Симона Дж. Д. Принса, Алгоритм Алгоритм 15.4: максимальное правдоподобие обучения проективному преобразованию (гомографии) изложен в его буклете Алгоритмы : задача решается с помощью нелинейного сведение к минимуму.

3 голосов
/ 10 октября 2012

Может быть, вы могли бы использовать четырехугольник?Смотрите мой ответ здесь:

https://stackoverflow.com/a/12820877/202451

Тогда вы будете иметь полный контроль над каждой точкой и сможете легко сделать любую четырехугольную форму.:)

0 голосов
/ 03 января 2014

Java-реализация с минимальными зависимостями

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

Преобразование в исходном файле Homography . Это сводится к построению и решению матрицы:

/**
* Please note that Dr. John Zelle assisted us in developing the code to
* handle the matrices involved in solving for the homography mapping.
* 
**/
Matrix A = new Matrix(new double[][]{
                {x1, y1, 1, 0,  0,  0, -xp1*x1, -xp1*y1},
                {0,  0,  0, x1, y1, 1, -yp1*x1, -yp1*y1},
                {x2, y2, 1, 0,  0,  0, -xp2*x2, -xp2*y2},
                {0,  0,  0, x2, y2, 1, -yp2*x2, -yp2*y2},
                {x3, y3, 1, 0,  0,  0, -xp3*x3, -xp3*y3},
                {0,  0,  0, x3, y3, 1, -yp3*x3, -yp3*y3},
                {x4, y4, 1, 0,  0,  0, -xp4*x4, -xp4*y4},
                {0,  0,  0, x4, y4, 1, -yp4*x4, -yp4*y4}
        });

        Matrix XP = new Matrix(new double[][]
                          {{xp1}, {yp1}, {xp2}, {yp2}, {xp3}, {yp3}, {xp4}, {yp4}});
        Matrix P = A.solve(XP);
        transformation = new Matrix(new double[][]{
                {P.get(0, 0), P.get(1, 0), P.get(2,0)},
                {P.get(3, 0), P.get(4, 0), P.get(5,0)},
                {P.get(6, 0), P.get(7, 0), 1}
        });

Использование: следующий метод выполняет окончательное преобразование:

public Point2D.Double transform(Point2D.Double point) {
    Matrix p = new Matrix(new double[][]{{point.getX()}, {point.getY()}, {1}});
    Matrix result = transformation.times(p);
    double z = result.get(2, 0);
    return new Point2D.Double(result.get(0, 0) / z, result.get(1, 0) / z);
}

Зависимость класса Matrix взята из JAMA: пакет Java Matrix

Лицензия

  1. Wii-взаимодействовать GNU GPL v3
  2. JAMA общественное достояние
...