Как я могу определить расстояние от объекта в видео?
У меня есть видеофайл, записанный с передней части движущегося автомобиля. Я хочу использовать OpenCV для обнаружения и распознавания объектов, но я застрял на одном аспекте. Как я могу определить расстояние от распознанного объекта.
Я могу знать свою текущую скорость и реальное положение GPS, но это все. Я не могу сделать никаких предположений об объекте, который я отслеживаю. Я планирую использовать это для отслеживания и отслеживания объектов, не сталкиваясь с ними. В идеале я хотел бы использовать эти данные чтобы получить реальное положение объекта, которое я мог бы сделать, если бы мог определить расстояние от камеры до объекта.
8 ответов:
когда у вас есть документальное видео, вы можете использовать временной параллакс для определения относительного расстояния объектов. Параллакс: (определение).
эффект будет тот же, что мы получаем с нашими глазами, которые могут получить восприятие глубины, глядя на один и тот же объект с несколько разных углов. Поскольку вы двигаетесь, вы можете использовать два последовательных видеокадра, чтобы получить немного другой угол.
используя вычисления параллакса, вы можете определите относительные размер и расстояние объектов (относительно друг друга). Но, если вы хотите абсолютное размер и расстояние, вам понадобится известная точка отсчета.
вы также должны знать скорость и направление движения (а также частоту кадров видео) для того, чтобы сделать расчеты. Ты может быть в состоянии получить скорость транспортного средства, используя визуальные данные, но это добавляет еще одно измерение сложность.
технология уже существует. Спутники определяют топографическая протуберанец (высота), сравнивая несколько снимков, сделанных в течение короткого периода времени. Мы используем параллакс для определения расстояния до звезд, делая фотографии ночного неба в разных точках орбиты Земли вокруг Солнца. Я смог создать трехмерные изображения из окна самолета, сделав две фотографии в короткой последовательности.
точная технология и расчеты (даже если бы я знал их с головы до ног) являются путь вне сферы обсуждения здесь. Если я смогу найти достойную ссылку, я опубликую ее здесь.
ваша проблема вполне стандартна в этой области.
во-первых,
нужно откалибровать камеру. Это можно сделать offline (делает жизнь много проще) или онлайн через собственн-тарировки.
откалибровать его в автономном режиме - пожалуйста.
во-вторых,
после того, как у вас есть калибровочная матрица камеры K, определите матрицу проекции камеры внутри последовательная сцена (вам нужно использовать параллакс, как упоминалось другими). Это хорошо описано в этом OpenCV tutorial.
вам придется использовать информацию GPS, чтобы найти относительную ориентацию между камерами в последовательных сценах (что может быть проблематичным из-за шума, присущего большинству GPS-устройств), т. е. R и t упоминается в учебнике или вращение и перевод между двумя камерами.
один раз вы решили все это, у вас будет две проекционные матрицы-представления камер на этих последовательных сценах. Используя одну из этих так называемых матриц камеры, вы можете "проецировать" 3D-точку M на сцене к 2D изображению камеры дальше к координате пиксела m (как в учебнике).
мы будем использовать это для триангуляции реальной 3D точки из 2D точек, найденных в вашем видео.
в-третьих,
использовать точку интереса детектор для отслеживания той же точки в вашем видео, которая лежит на объекте интереса. Есть несколько доступных детекторов, я рекомендую SURF так как у вас есть OpenCV, который также имеет несколько других детекторов, таких как углы Ши-Томаси,Харрис,etc.
в-четвертых,
после того, как вы отследили точки вашего объекта по всей последовательности и получили соответствующие координаты 2D пикселей, вы должны triangulate для лучшей подгонки 3D-точки с учетом вашей матрицы проекции и 2D-точек.
приведенное выше изображение хорошо отражает неопределенность и то, как вычисляется наилучшая трехмерная точка. Конечно, в вашем случае камеры, вероятно, находятся друг перед другом!
наконец,
после того, как вы получили 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'. я просто дал вам несколько ключевых слов, которые могли бы вам помочь.

Comments