Вычисление координат реального мира с использованием стереоизображений в Python и OpenCV

Я работаю над вычислением реальных координат объекта в сцене, используя пару стереоизображений. Изображения имитируют идеальные камеры-обскуры, поэтому нет искажений, которые нужно исправить, и нет вращения. Я знаю, что в OpenCV есть множество функций для калибровки стереокамер и создания карт несоответствий, но если все, что я хочу вычислить, — это координаты одной точки, есть ли простой способ сделать это?


person Richard    schedule 27.05.2015    source источник


Ответы (1)


1) Случай отсутствия вращения, только перенос параллельно горизонтальной оси плоскости изображения, камеры с равным фокусным расстоянием.

Обозначим буквой «f» общее фокусное расстояние. Обозначим через «b» базовую линию стереопары, а именно расстояние между оптическими центрами камер. Дана трехмерная точка P, видимая в обеих камерах по горизонтали изображения с координатами x_left и x_right, обозначим через "d" их несоответствие, а именно разность d = x_left - x_right.

Из элементарной геометрии следует, что глубина z_left точки P в координатах левой камеры равна:

z_left = b * f / d.

2) Любой другой случай (неравные фокусные расстояния, различия в других собственных параметрах, нелинейная дисторсия объектива, межкамерный поворот, перемещение не параллельно оси x и т. д.):

Не беспокойтесь, используйте OpenCV,

person Francesco Callari    schedule 28.05.2015
comment
Итак, если я получу глубину от левой камеры, используя это уравнение, есть ли способ, которым я мог бы превратиться в координату XYZ с левой камерой, являющейся источником? - person Richard; 01.06.2015
comment
Да, ты можешь. Преобразуйте пиксель (x, y) относительно центра изображения в нормализованные координаты изображения (т. е. умножьте их на отношение sensor_width / image_width), сделайте то же самое для базовой линии b в уравнении для z_left выше и выразите фокусное расстояние в метрах как Что ж. Тогда Z = z_left, X = x_normalized * Z, Y = y_normalized * Z. Опять же, вероятно, проще просто использовать OpenCV для выполнения этих вычислений, поскольку этот код был тщательно отлажен и защищен от пограничных случаев. - person Francesco Callari; 01.06.2015
comment
И если вы найдете этот ответ полезным, мы будем признательны за голосование. - person Francesco Callari; 01.06.2015