Как я могу определить расстояние от объекта в видео?
У меня есть видеофайл, записанный с передней части движущегося транспортного средства. Я собираюсь использовать OpenCV для обнаружения и распознавания объектов, но я застрял в одном аспекте. Как я могу определить расстояние от распознанного объекта.
Я могу знать свою текущую скорость и реальное положение GPS, но это все. Я не могу делать никаких предположений об объекте, который я отслеживаю. Я планирую использовать это, чтобы отслеживать и отслеживать объекты, не сталкиваясь с ними. В идеале я хотел бы использовать эти данные для определения положения объекта в реальном мире, что я мог бы сделать, если бы мог определить расстояние от камеры до объекта.
8 ответов
Когда у вас есть движущееся видео, вы можете использовать временный параллакс для определения относительного расстояния объектов. Параллакс: ( определение).
Эффект был бы таким же, какой мы получаем нашими глазами, которые могут получить восприятие глубины, если смотреть на один и тот же объект под немного разными углами. Поскольку вы двигаетесь, вы можете использовать два последовательных видеокадра, чтобы получить немного другой угол обзора.
Используя расчеты параллакса, вы можете определить относительный размер и расстояние объектов (относительно друг друга). Но если вам нужен абсолютный размер и расстояние, вам понадобится известная точка отсчета.
Вам также нужно знать скорость и направление движения (а также частоту кадров видео), чтобы выполнить вычисления. Вы можете определить скорость автомобиля, используя визуальные данные, но это добавляет еще одно измерение сложности.
Технология уже существует. Спутники определяют высоту рельефа (высоту) путем сравнения нескольких изображений, снятых за короткий промежуток времени. Мы используем параллакс для определения расстояния звезд, фотографируя ночное небо в разных точках земной орбиты вокруг Солнца. Мне удалось создать трехмерные изображения из окна самолета, сделав две фотографии в короткие сроки.
Точные технологии и расчеты (даже если бы я знал их по уши) далеко выходят за рамки обсуждения. Если я найду достойную ссылку, я опубликую ее здесь.
Ваша проблема вполне стандартна в этой области.
Во-первых,
вам нужно откалибровать камеру. Это может быть сделано в автономном режиме (делает жизнь намного проще) или в режиме онлайн с помощью самокалибровки.
Откалибруйте его в автономном режиме - пожалуйста.
Во-вторых,
Получив калибровочную матрицу камеры K, определите проекционную матрицу камеры в последовательной сцене (вам нужно использовать параллакс, как уже упоминалось другими). Это хорошо описано в этом руководстве по OpenCV.
Вы должны будете использовать информацию GPS, чтобы найти относительную ориентацию между камерами в последовательных сценах (что может быть проблематично из-за шума, присущего большинству устройств GPS), то есть R и T, упомянутые в руководстве, или вращение и перевод между двумя камерами.
Как только вы решите все это, у вас будет две проекционные матрицы - изображения камер в этих последовательных сценах. Используя одну из этих так называемых матриц камеры, вы можете "проецировать" 3D-точку M на сцене на 2D-изображение камеры на пиксельную координату m (как в учебном пособии).
Мы будем использовать это для триангуляции реальной 3D-точки из 2D-точек, найденных в вашем видео.
В-третьих,
используйте детектор точек интереса, чтобы отслеживать ту же точку в видео, которая находится на интересующем объекте. Доступно несколько детекторов, я рекомендую SURF, так как у вас есть OpenCV, который также имеет несколько других детекторов, таких как уголки Ши-Томази, Харрис и т. Д.
В-четвертых,
После того, как вы отследили точки своего объекта по всей последовательности и получили соответствующие 2D-координаты пикселей, вы должны выполнить триангуляцию для наилучшего соответствия 3D-точки с учетом матрицы проекции и 2D-точек.
Приведенное выше изображение прекрасно отражает неопределенность и способ вычисления наилучшей подходящей трехмерной точки. Конечно, в вашем случае, камеры, вероятно, друг перед другом!
В заключение,
После того, как вы получили 3D-точки на объекте, вы можете легко вычислить евклидово расстояние между центром камеры (который в большинстве случаев является источником) и точкой.
Заметка
Это, очевидно, нелегкая вещь, но это не так сложно. Я рекомендую отличную книгу Хартли и Циссермана Multiple View Geometry, в которой все подробно описано выше с помощью кода MATLAB для загрузки.
Веселитесь и продолжайте задавать вопросы!
Вам нужно идентифицировать одинаковые точки в одном и том же объекте в двух разных кадрах, взятых на известном расстоянии друг от друга. Поскольку вы знаете местоположение камеры в каждом кадре, у вас есть базовая линия (вектор между двумя положениями камеры. Постройте треугольник от известной базовой линии и углов до обозначенных точек. Тригонометрия дает вам длину неизвестных сторон цепочки для известной длины базовой линии и известных углов между базовой линией и неизвестными сторонами.
Вы можете использовать две камеры или одну камеру, делающую последовательные снимки. Таким образом, если ваш автомобиль движется со скоростью 1 м / с и вы снимаете славу каждую секунду, то кадры успеха дадут вам базовую линию в 1 м, которая должна быть хорошей для измерения расстояния до объектов, скажем, до 5 м. Если вам нужно расположить объекты дальше, чем используемые кадры, они должны быть дальше друг от друга - однако более отдаленные объекты будут видны дольше.
Наблюдатель в F1 видит цель в точке T с углом a1 к вектору скорости. Наблюдатель перемещает расстояние b до F2. Видит цель в точке Т с углом а2.
Требуется, чтобы найти 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
х - расстояние до цели, ортогональное вектору скорости наблюдателя
z - расстояние от F2 до пересечения с x
Решение для r1
r1 = b / (c3 - c1 . c4 / c2)
Две камеры, чтобы вы могли обнаружить параллакс. Это то, что делают люди.
редактировать
Пожалуйста, смотрите ответ 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/~asaxena/learningdepth/
Кто-то, пожалуйста, поправьте меня, если я ошибаюсь, но мне кажется, что если вы собираетесь просто использовать одну камеру и просто полагаться на программное решение, любая обработка, которую вы можете сделать, будет склонна к ложным срабатываниям. Я очень сомневаюсь, что есть какая-то обработка, которая может показать разницу между объектами, которые действительно находятся на воспринимаемом расстоянии, и объектами, которые только кажутся находящимися на таком расстоянии (например, "вынужденная перспектива") в фильмах.
Есть ли шанс, что вы могли бы добавить ультразвуковой датчик?
Сначала вы должны откалибровать свою камеру, чтобы вы могли получить связь между позициями объектов в плане камеры и их позициями в плане реального мира, если вы используете одну камеру, вы можете использовать "технику оптического потока", если вы используете В двух камерах вы просто используете триангуляцию, чтобы найти реальное положение (будет легко определить расстояние до объектов), но зондом с этим вторым методом является сопоставление, которое означает, как вы можете найти положение объекта "х" в камере2, если вы уже знаете ее положение в камере1, и здесь вы можете использовать алгоритм "SIFT". Я просто дал вам несколько ключевых слов, которые могут помочь вам.
Поместите и объект известного размера в поле зрения камеры. Таким образом, вы можете иметь более объективную метрику для измерения угловых расстояний. Без второй точки обзора / камеры вы будете ограничены в оценке размера / расстояния, но по крайней мере это не будет полным предположением.