Природа взаимосвязи между оптическим потоком и глубиной
Предполагая статическую сцену, когда одна камера движется точно вбок на небольшом расстоянии, есть два кадра и следующий вычисленный оптический поток (я использую opencv's calcOpticalFlowFarneback
):
Здесь точками разброса являются обнаруженные объекты, которые окрашены в псевдоколор со значениями глубины (красный - небольшая глубина, близко к камере, синий - более удаленный). Теперь я получаю эти значения глубины, просто инвертируя величину оптического потока, как d = 1 / flow
, Кажется довольно интуитивным, в параллаксе движения - чем ярче объект, тем ближе он к наблюдателю. Таким образом, есть куб, выставляющий передний край и немного бокового края камере.
Но затем я пытаюсь спроецировать эти характерные точки с плоскости камеры на реальные координаты, чтобы сделать вид карты сверху (где X = (x * d) / f
а также Y = d
(где d - глубина, x- координата пикселя, f - фокусное расстояние, а X и Y - реальные координаты). И вот что я получаю:
Ну, не выглядит кубическим для меня. Похоже, что изображение перекошено вправо. Я провел некоторое время, думая о том, почему, и кажется, что 1 / flow
не является точной метрикой глубины. Играя с разными значениями, скажем, если я использую 1 / power(flow, 1 / 3)
Я получаю лучшую картину:
Но, конечно, сила 1 / 3 - это просто магическое число из моей головы. Вопрос в том, какова связь между оптическим потоком в глубине в целом, и как я предполагаю оценить его для данной сцены? Мы просто рассматриваем перевод камеры здесь. Я наткнулся на некоторые статьи, но безуспешно пытаясь найти общее уравнение. Некоторые, как этот, предлагают изменение 1 / flow
Я думаю, что это не сработает.
Обновить
Меня немного беспокоит то, что простая геометрия указывает мне на 1 / flow
ответь тоже. Мол, оптический поток такой же (в моем случае), как диспаратность, верно? Затем, используя эту формулу, я получаю d = Bf / (x2 - x1)
где B - расстояние между двумя положениями камеры, f - фокусное расстояние, x2-x1 - это точно оптический поток. Фокусное расстояние является константой, а B - константой для любых двух заданных кадров, поэтому у меня остается 1 / flow
снова умножается на константу. Я неправильно понимаю что-то о том, что такое оптический поток?
1 ответ
Для статичной сцены перемещение камеры точно в известную величину вбок точно соответствует настройке стереокамеры. Исходя из этого, вы действительно можете оценить глубину, если ваша система откалибрована.
Обратите внимание, что калибровка в этом смысле довольно широка. Для того, чтобы получить действительно точную глубину, вам нужно будет в конце предоставить параметр масштаба поверх обычной калибровочной информации, которую вы имеете в openCV, иначе есть единственная неоднозначность 3D (этот последний шаг часто называют переходом). до "метрической" реконструкции только от "евклидовой").
Другая вещь, которая отличается от широкой калибровки, это компенсация искажения линзы. Прежде всего, вы, вероятно, захотите заставить свои камеры вести себя как камеры с точечным отверстием (чего обычно не делают камеры реального мира).
При этом оптический поток определенно очень отличается от метрической карты глубины. Если вы сначала правильно откалибровали и выполнили свою систему, то оптический поток все равно не эквивалентен оценке диспаратности. Если ваша система выпрямлена, нет смысла проводить полную оценку оптического потока (например, Farnebäck), потому что после этого проблема ограничивается по горизонтальным линиям изображения. Выполнение полной оценки оптического потока (с получением 2 степеней свободы) приведет к большей вероятности ошибки после указанного выпрямления.
Отличным справочным материалом для всего этого является классическая " геометрия с несколькими видами в компьютерном зрении".