площадь трапеции
Я знаю, что преобразование квадрата в трапецию является линейным преобразованием и может быть сделано с помощью проективной матрицы, но у меня есть небольшая проблема с тем, как построить матрицу.
использование проективной матрицы для перевода, масштабирования, вращения и сдвига является простым. Существует ли простая проективная матрица, которая преобразует квадрат в трапецию?
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
лицензия
- Wii-interact GNU GPL v3
- Джама общественное достояние