Как определить расстояние от объекта в видео?
У меня есть видеофайл, записанный с передней стороны движущегося автомобиля. Я собираюсь использовать OpenCV для обнаружения и распознавания объектов, но я придерживаюсь одного аспекта. Как определить расстояние от распознанного объекта.
Я могу узнать свою текущую скорость и реальную GPS-позицию, но это все. Я не могу делать какие-либо предположения относительно объекта, который я отслеживаю. Я планирую использовать это для отслеживания и отслеживания объектов, не сталкиваясь с ними. В идеале я хотел бы использовать эти данные, чтобы получить объектное реальное положение, которое я мог бы сделать, если бы мог определить расстояние от камеры до объекта.
Ответы
Ответ 1
Когда вы перемещаете видео, вы можете использовать временный параллакс, чтобы определить относительное расстояние объектов. Параллакс: (определение).
Эффект будет тем же самым, что мы получим с нашими глазами, которые могут получить восприятие глубины, глядя на один и тот же объект с немного разных углов. Поскольку вы двигаетесь, вы можете использовать два последовательных видеокадра, чтобы получить немного другой угол.
Используя вычисления параллакса, вы можете определить относительный размер и расстояние объектов (относительно друг друга). Но, если вы хотите абсолютный размер и расстояние, вам понадобится известная точка отсчета.
Вам также необходимо знать скорость и направление движения (а также частоту кадров видео), чтобы выполнять вычисления. Вы можете получить скорость транспортного средства, используя визуальные данные, но это добавляет еще одно измерение сложности.
Технология уже существует. Спутники определяют топографическую известность (высота) путем сравнения нескольких изображений, сделанных за короткий промежуток времени. Мы используем параллакс для определения расстояния звезд, фотографируя ночное небо в разных точках земной орбиты вокруг Солнца. Мне удалось создать трехмерные изображения из окна самолета, сделав две фотографии в короткие сроки.
Точная технология и расчеты (даже если бы я знал их с ног до головы) оказались вне сферы обсуждения здесь. Если я найду достойную ссылку, я отправлю ее здесь.
Ответ 2
Ваша проблема вполне стандартная в этой области.
Во-первых,
вам нужно выполнить калибровку камеры. Это можно сделать offline (упрощает жизнь значительно) или онлайн через самокалибровку.
Отказывать его в автономном режиме - пожалуйста.
Во-вторых,
Как только у вас есть калибровочная матрица камеры K, определите матрицу проекции камеры в последовательной сцене (вам нужно использовать параллакс, как упоминалось другими). Это хорошо описано в этом учебнике OpenCV.
Вам нужно будет использовать информацию GPS, чтобы найти относительную ориентацию между камерами в последовательных сценах (что может быть проблематично из-за шума, присущего большинству блоков GPS), то есть R и t, упомянутые в учебнике или поворот и перевод между двумя камерами.
Как только вы решите все это, у вас будут две матрицы проекций --- представления камер в этих последовательных сценах. Используя одну из этих так называемых матриц камеры, вы можете "спроецировать" 3D-точку M на сцену на 2D-изображение камеры на координату пикселя m (как в учебнике).
Мы будем использовать это для триангуляции реальной трехмерной точки из 2D-точек, найденных в вашем видео.
В-третьих,
используйте детектор процентных точек для отслеживания той же точки в вашем видео, которая находится на интересующем объекте. Доступно несколько детекторов, я рекомендую SURF, так как у вас есть OpenCV, у которого также есть несколько других детекторов, таких как Уголки Ши-Томаси, Harris, и т.д..
В-четвертых,
Как только вы отслеживаете точки своего объекта по последовательности и получили соответствующие координаты 2D-пикселя, вы должны triangulate для наилучшего соответствия 3D с учетом вашей проекционной матрицы и двумерных точек.
![Triangulation]()
Вышеприведенное изображение прекрасно отражает неопределенность и то, как вычисляется оптимальная 3D-точка. Конечно, в вашем случае камеры, вероятно, впереди друг друга!
Наконец,
Как только вы получили 3D-объекты объекта, вы можете легко вычислить эвклидовое расстояние между центром камеры (которое является источником в большинстве случаев) и точкой.
Примечание
Это, очевидно, непросто, но это не так сложно. Я рекомендую Hartley и Zisserman отличную книгу Множественная геометрия просмотров, которая подробно описала все выше, с помощью кода MATLAB для загрузки.
Удачи и продолжайте задавать вопросы!
Ответ 3
Вам нужно идентифицировать те же точки в одном и том же объекте на двух разных кадрах, сделанных на известном расстоянии друг от друга. Поскольку вы знаете местоположение камеры в каждом кадре, у вас есть базовый уровень (вектор между двумя положениями камеры. Постройте треугольник от известной базовой линии и углы к идентифицированным точкам. Тригонометрия дает вам длину неизвестных сторон трайлы для известной длины базовой линии и известные углы между базовой линией и неизвестными сторонами.
Вы можете использовать две камеры или одну камеру с последовательными снимками. Итак, если ваш автомобиль движется на скорости 1 м/с, и вы принимаете знаменитости каждую секунду, тогда кадры с успехом дадут вам 1-метровый базовый уровень, который должен быть хорош для измерения расстояния до объекта, скажем, на расстоянии 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)
Ответ 4
Две камеры, чтобы вы могли обнаружить параллакс. Это то, что делают люди.
изменить
Для получения более подробной информации см. ответ ravenspoint. Кроме того, имейте в виду, что достаточно одной камеры с разветкителем.
Ответ 5
используйте карты стереоизображения. множество реализаций на плаву, вот несколько ссылок:
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/~asaxena/learningdepth/
Ответ 6
Кто-то, пожалуйста, поправьте меня, если я ошибаюсь, но мне кажется, что если вы собираетесь просто использовать одну камеру и просто полагаться на программное решение, любая обработка, которую вы могли бы сделать, была бы склонна к ложным срабатываниям. Я очень сомневаюсь, что есть какая-либо обработка, которая могла бы отличить объекты, которые действительно находятся на воспринимаемом расстоянии, и те, которые только появляются на таком расстоянии (например, "принудительная перспектива" ) в фильмах.
Можно ли добавить ультразвуковой датчик?
Ответ 7
Поместите и объект известного размера в поле зрения камер. Таким образом, вы можете иметь более объективную метрику для измерения расстояний angular. Без второй точки зрения/камеры вы будете ограничены оценкой размера/расстояния, но, по крайней мере, это не будет полным предположением.
Ответ 8
сначала вы должны откалибровать свою камеру, чтобы вы могли установить связь между позициями объектов в плане камеры и их положениями в реальном плане мира, если вы используете одну камеру, поэтому можете использовать "метод оптического потока",
если вы используете две камеры, вы просто используете простой треугольник, чтобы найти реальную позицию (вам будет легко найти расстояние от объектов), но пробный с этим вторым метозом является совпадением, что означает, как вы можете найти положение объект 'x' в camera2, если вы уже установили его положение в камере1, и здесь вы можете использовать алгоритм SIFT.
Я просто дал вам несколько ключевых слов, которые могли бы вам помочь.