Как я могу определить расстояние от объекта в видео?


У меня есть видеофайл, записанный с передней части движущегося автомобиля. Я хочу использовать OpenCV для обнаружения и распознавания объектов, но я застрял на одном аспекте. Как я могу определить расстояние от распознанного объекта.

Я могу знать свою текущую скорость и реальное положение GPS, но это все. Я не могу сделать никаких предположений об объекте, который я отслеживаю. Я планирую использовать это для отслеживания и отслеживания объектов, не сталкиваясь с ними. В идеале я хотел бы использовать эти данные чтобы получить реальное положение объекта, которое я мог бы сделать, если бы мог определить расстояние от камеры до объекта.

8   51   2010-01-25 22:48:58

8 ответов:

когда у вас есть документальное видео, вы можете использовать временной параллакс для определения относительного расстояния объектов. Параллакс: (определение).

эффект будет тот же, что мы получаем с нашими глазами, которые могут получить восприятие глубины, глядя на один и тот же объект с несколько разных углов. Поскольку вы двигаетесь, вы можете использовать два последовательных видеокадра, чтобы получить немного другой угол.

используя вычисления параллакса, вы можете определите относительные размер и расстояние объектов (относительно друг друга). Но, если вы хотите абсолютное размер и расстояние, вам понадобится известная точка отсчета.

вы также должны знать скорость и направление движения (а также частоту кадров видео) для того, чтобы сделать расчеты. Ты может быть в состоянии получить скорость транспортного средства, используя визуальные данные, но это добавляет еще одно измерение сложность.

технология уже существует. Спутники определяют топографическая протуберанец (высота), сравнивая несколько снимков, сделанных в течение короткого периода времени. Мы используем параллакс для определения расстояния до звезд, делая фотографии ночного неба в разных точках орбиты Земли вокруг Солнца. Я смог создать трехмерные изображения из окна самолета, сделав две фотографии в короткой последовательности.

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

ваша проблема вполне стандартна в этой области.

во-первых,

нужно откалибровать камеру. Это можно сделать offline (делает жизнь много проще) или онлайн через собственн-тарировки.

откалибровать его в автономном режиме - пожалуйста.

во-вторых,

после того, как у вас есть калибровочная матрица камеры K, определите матрицу проекции камеры внутри последовательная сцена (вам нужно использовать параллакс, как упоминалось другими). Это хорошо описано в этом OpenCV tutorial.

вам придется использовать информацию GPS, чтобы найти относительную ориентацию между камерами в последовательных сценах (что может быть проблематичным из-за шума, присущего большинству GPS-устройств), т. е. R и t упоминается в учебнике или вращение и перевод между двумя камерами.

один раз вы решили все это, у вас будет две проекционные матрицы-представления камер на этих последовательных сценах. Используя одну из этих так называемых матриц камеры, вы можете "проецировать" 3D-точку M на сцене к 2D изображению камеры дальше к координате пиксела m (как в учебнике).

мы будем использовать это для триангуляции реальной 3D точки из 2D точек, найденных в вашем видео.

в-третьих,

использовать точку интереса детектор для отслеживания той же точки в вашем видео, которая лежит на объекте интереса. Есть несколько доступных детекторов, я рекомендую SURF так как у вас есть OpenCV, который также имеет несколько других детекторов, таких как углы Ши-Томаси,Харрис,etc.

в-четвертых,

после того, как вы отследили точки вашего объекта по всей последовательности и получили соответствующие координаты 2D пикселей, вы должны triangulate для лучшей подгонки 3D-точки с учетом вашей матрицы проекции и 2D-точек. Triangulation

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

наконец,

после того, как вы получили 3D точки на объекте, вы можете легко вычислить Евклидово расстояние между центром камеры (который является источником в большинстве случаев) и это главное.

Примечание

Это, очевидно, не легкий материал, но это не так уж и сложно. Я рекомендую отличную книгу Хартли и Зиссермана Множественный Вид Геометрии который подробно описал все выше с помощью кода MATLAB для загрузки.

удачи и продолжайте задавать вопросы!

вам нужно идентифицировать одни и те же точки в одном и том же объекте на двух разных кадрах, взятых на известном расстоянии друг от друга. Поскольку вы знаете расположение камеры в каждом кадре, у вас есть базовая линия ( вектор между двумя позициями камеры. Постройте треугольник из известной базовой линии и углов к идентифицированным точкам. Тригонометрия дает вам длину неизвестных сторон трейнглов для известной длины базовой линии и известных углов между базовой линией и неизвестные стороны.

вы можете использовать две камеры или одну камеру брать последовательные кадры. Итак, если ваш автомобиль движется со скоростью 1 м/с, и вы принимаете fames каждую секунду, то successibe frames будет издеваться над вами 1M базовой линией, которая должна быть хороша для измерения расстояния объектов до, скажем, 5 м. Если вам нужно расположить объекты дальше, чем используемые кадры должны быть дальше друг от друга-однако более отдаленные объекты будут в поле зрения дольше.

наблюдатель на F1 видит цель на T с угол a1 к вектору скорости. Наблюдатель перемещает расстояние b в F2. Видит цель на T с углом a2.

требуется найти r1, диапазон от цели на F1

тригонометрическое тождество для Косинуса дает

Cos (90-a1) = x / r1 = c1

Cos (90-a2) = x / r2 = c2

Cos (a1) = (b + z) / r1 = c3

Cos( a2) = z / r2 = c4

x-расстояние до цели, ортогональное скорости наблюдателя вектор

z-расстояние от F2 до пересечения с x

решение для r1

r1 = b / (c3 – c1 . c4 / c2)

две камеры, так что вы можете обнаружить параллакс. Это то, что делают люди.

edit

пожалуйста, смотрите ответ ravenspoint для более подробной информации. Кроме того, имейте в виду, что одной камеры со сплиттером, вероятно, будет достаточно.

используйте стерео карты диспаритета. множество реализаций находятся на плаву, вот некоторые ссылки: http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT11/node4.html

http://www.ece.ucsb.edu/~manj / ece181bS04/L14 (morestereo).pdf

в случае, если у вас нет стереокамеры, но глубина может быть оценена с помощью видео http://www.springerlink.com/content/g0n11713444148l2/

Я думаю, что выше будет что может помочь вам больше всего.

исследования продвинулись настолько далеко, что глубина может быть оценена (хотя и не в удовлетворительной степени) из одного монокулярного изображения http://www.cs.cornell.edu / ~асаксена / learningdepth/

кто-то пожалуйста, поправьте меня, если я ошибаюсь, но мне кажется, что если вы собираетесь просто использовать одну камеру и просто опираясь на программное решение, любая обработка, вы могли бы быть склонны к ложным срабатываниям. Я очень сомневаюсь, что есть какая-либо обработка, которая могла бы сказать разницу между объектами, которые действительно находятся на воспринимаемом расстоянии, и теми, которые только кажутся на этом расстоянии (например, "принудительная перспектива") в фильмах.

любой шанс вы могли бы добавить ультразвуковой датчик?

Поместите и объект известного размера в поле зрения камеры. Таким образом, вы можете иметь более объективную метрику для измерения угловых расстояний. Без второй точки обзора / камеры вы будете ограничены оценкой размера / расстояния, но, по крайней мере, это не будет полным предположением.

сначала вы должны откалибровать свою камеру, чтобы вы могли получить отношение между позициями объектов в плане камеры и их позициями в плане реального мира, если вы используете одну камеру, поэтому вы можете использовать " метод оптического потока" если вы используете две камеры, вы просто используете простой triangulatio, чтобы найти реальное положение (будет легко найти расстояние до объектов), но пробем с этой второй метозой-это соответствие, что означает, как вы можете найти положение объекта объект ' x 'в camera2 если вы уже knoz это позиция в camera1 и здесь вы можете использовать алгоритм' SIFT'. я просто дал вам несколько ключевых слов, которые могли бы вам помочь.