Преобразование двойных координат «рыбий глаз» в равнопрямоугольные координаты

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

// 2D fisheye to 3D vector
phi = r * aperture / 2
theta = atan2(y, x)

// 3D vector to longitude/latitude
longitude = atan2(Py, Px)
latitude = atan2(Pz, (Px^2 + Py^2)^(0.5))

// 3D vector to 2D equirectangular
x = longitude / PI
y = 2 * latitude / PI

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

const float FOV = 220.0f * PI / 180.0f;
float r = sqrt(u*u + v*v);
float theta = atan2(v, u);
float phi = r * FOV * 0.5f;
float px = u;
float py = r * sin(phi);
float pz = v;
float longitude = atan2(py, px); // theta
float latitude = atan2(pz, sqrt(px*px + py*py)); // phi
x = longitude / PI;
y = 2.0f * latitude / PI;

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

Предположим, что FOV моей камеры составляет 220 градусов, а разрешение камеры составляет 2880x1440, я ожидаю, что точка (358, 224) для задней камеры в области перекрытия и точка (2563, 197) для передней камеры в области перекрытия будут обе сопоставлены к координате, близкой к (2205, 1009). Однако фактическими точками отображения являются (515.966370,1834.647949) и (1644.442017,1853.060669) соответственно, которые очень далеки от (2205,1009). Пожалуйста, предложите, как исправить приведенный выше код. Большое спасибо!


person chesschi    schedule 23.10.2017    source источник


Ответы (1)


Вы строите равнопрямоугольное изображение, поэтому я предлагаю вам использовать обратное отображение.

Начните с расположения пикселей в целевом изображении, которое вы рисуете. Преобразуйте 2D-местоположение в долготу/широту. Затем преобразуйте это в трехмерную точку на поверхности единичной сферы. Затем преобразуйте 3D-точку в местоположение исходного 2D-изображения «рыбий глаз». На странице Пола Бурка вы должны начать с нижнего уравнения, затем с самого правого, а затем с самого верхнего.

Используйте ориентиры, такие как 90° долготы 0° широты, чтобы убедиться, что результаты имеют смысл на каждом этапе.

Конечным результатом должно быть местоположение в исходном изображении «рыбий глаз» в диапазоне [-1..+1]. При необходимости переназначьте на пиксель или на UV. Поскольку источник разделен на два изображения глаза, вам также потребуется сопоставление целевых (эквивалентных) долгот с правильным исходным фрагментом изображения.

person Joan Charmant    schedule 27.10.2017