У меня есть 3 точки в трехмерном пространстве, точное расположение которых я знаю. Предположим, это: (x0,y0,z0), (x1,y1,z1) и (x2,y2,z2).
Также у меня есть камера, которая смотрит на эти 3 точки, и я знаю двухмерное расположение этих трех точек на плоскости обзора камеры. Так, например, (x0,y0,z0) будет (x0',y0'), (x1,y1,z1) будет (x1',y1'), а (x2,y2,z2) будет (x2',y2') с точки зрения камеры.
Каков самый простой способ найти матрицу проекции, которая будет проецировать эти 3D-точки в 2D-точки на плоскости обзора камеры. Мы ничего не знаем о местонахождении камеры.





Это дает вам два набора, каждый из трех уравнений с 3 переменными:
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'
d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'
Просто используйте любой метод решения одновременных уравнений, который является наиболее простым в вашей ситуации (их даже не сложно решить «вручную»). Тогда ваша матрица преобразования будет просто ((a, b, c) (d, e, f)).
...
На самом деле это слишком упрощенно и предполагает, что камера направлена в начало вашей трехмерной системы координат, а не перспектива.
Для перспективы матрица преобразования работает скорее так:
( a, b, c, d ) ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
( i, j, k, l ) ( zt )
( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;
но матрица 4x3 более ограничена, чем 12 степеней свободы, так как мы должны иметь
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1
Таким образом, у вас, вероятно, должно быть 4 точки, чтобы получить 8 уравнений, охватывающих 6 переменных для положения и угла камеры, и еще 1 для масштабирования двухмерных точек обзора, поскольку мы сможем исключить «центральные» координаты (xc, yc ).
Итак, если у вас есть 4 точки и вы преобразуете свои двумерные точки обзора относительно центра экрана, то вы можете получить 14 одновременных уравнений с 13 переменными и решить.
К сожалению, шесть уравнений не являются линейными. К счастью, все переменные в этих уравнениях ограничены значениями от -1 до 1, поэтому, вероятно, все еще возможно решить уравнения.
Ваше решение, вероятно, было лучшим ответом на мою проблему. Расскажите, пожалуйста, подробнее о второй части решения. что такое xv и yv, а также md и zt и xt yt zt. Большое спасибо
Я не думаю, что информации достаточно, чтобы найти окончательное решение. Без знания местоположения камеры и плоскости обзора существует бесконечное количество матриц, которые могут решить эту проблему.
Нет, он имеет в виду, что существует бесконечное количество матриц, которые делают то, что вы просите для данного набора точек. Вам нужно либо больше точек, либо меньше свободы (например, исправить FOV камеры), чтобы исправить это.
Если вы знаете плоскость обзора камеры (расстояние Z от камеры), используя точки, вы можете определить положение камеры, поскольку это просто пересечение трех линий. Оттуда, я думаю, можно было бы вычислить оси матрицы.
Ваша камера имеет (как минимум) 7 степеней свободы - 3 для положения, 3 для ориентации и 1 для FOV. Я уверен, что кто-то поправит меня, если я ошибаюсь, но не похоже, что 3 балла достаточно для полного решения.
Чтобы получить обобщенное решение этой проблемы, найдите «Просмотр корреляции» в Graphics Gems II.
7 обычно является правильным, хотя некоторые системы допускают два параметра для поля зрения: вертикальный и горизонтальный. Обычно они пропорциональны друг другу (т. Е. Экран 4: 3 = соотношение поля зрения 4: 3), но в некоторых случаях это может быть искажено, если пользователь желает.
То, что вы ищете, называется алгоритмом оценки позы. Взгляните на реализацию POSIT в OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit
Вам понадобится четыре или более точек, и они могут не лежать в одной плоскости.
Учебное пособие по этой реализации находится здесь: http://opencv.willowgarage.com/wiki/Posit
Однако будьте осторожны: в учебнике используется квадратное окно просмотра, поэтому все координаты просмотра находятся в диапазоне от -1, -1 до 1,1. Это заставляет предположить, что они должны быть в системе координат камеры (до коррекции соотношения сторон). Это не так, поэтому, если вы используете область просмотра, например, соотношение сторон 4: 3, то ваши входные координаты должны быть в диапазоне от -1,3333, от -1 до 1,3333,1.
Кстати, если ваши точки должен лежат в одной плоскости, вы также можете посмотреть алгоритм CameraCalibration из OpenCV, но это более сложно настроить и требует большего количества точек в качестве входных данных. Однако он также предоставит вам информацию об искажениях и внутренних параметрах вашей камеры.
Это не моя домашняя работа!