Как я могу определить расстояние от объекта в видео? - PullRequest
54 голосов
/ 25 января 2010

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

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

Ответы [ 8 ]

55 голосов
/ 28 января 2010

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

Во-первых,

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

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

Во-вторых,

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

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

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

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

В-третьих,

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

В-четвертых, * * тысяча пятьдесят-одна После того, как вы отследили точки своего объекта по всей последовательности и получили соответствующие 2D-координаты пикселя, вы должны триангулировать для наилучшей подгонки 3D-точки с учетом матрицы проекции и 2D-точек. Triangulation Приведенное выше изображение прекрасно отражает неопределенность и способ вычисления наиболее подходящей трехмерной точки. Конечно, в вашем случае камеры, вероятно, стоят друг перед другом! Наконец,

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

Примечание

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

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

36 голосов
/ 25 января 2010

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

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

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

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

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

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

5 голосов
/ 25 января 2010

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

Вы можете использовать две камеры или одну камеру, делающую последовательные снимки. Таким образом, если ваш автомобиль движется со скоростью 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

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

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

Решение для r1

r1 = b / (c3 - c1. C4 / c2)

4 голосов
/ 25 января 2010

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

редактировать

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

3 голосов
/ 27 января 2010

использовать стерео карты диспаратности. множество реализаций находятся на плаву, вот несколько ссылок: 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 голосов
/ 25 января 2010

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

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

0 голосов
/ 25 апреля 2013

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

0 голосов
/ 25 января 2010

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

...