площадь трапеции

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

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

3 ответов


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

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

Альфа, Бета, Гамма, Дельта-это четыре угла вашей 2D-трапеции.

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

H-это матрица 3х3, который вы ищете, это называется фонетическое письмо

    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 и alpha, beta, gamma, delta, вы можете решить предыдущие четыре системы уравнений для девяти неизвестных h1, h2, h3, h4, h5, h6, h7, h8, h9.

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

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

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

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


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

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

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


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

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

transormation находится в исходный файл гомографии. Он сводится к построению и решению матрицы:

/**
* 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 Package

лицензия

  1. Wii-interact GNU GPL v3
  2. Джама общественное достояние