В компьютерном зрении существует метод измерения расстояния до объекта без использования датчиков глубинны и стереокамер. В данной работе метод используется для определения положения и скорости тележки мостового крана.
Благодаря тому, что тележка оснащена энкодерами, я смогу показать, насколько точно работает данный метод, основанный на подобие треугольников. В статье показано как измерить дистанцию с помощью одной камеры, и как это можно использовать в практических задачах.
Тема посвящена моей дипломной работе в магистратуре, которую я писал два года назад.
Оборудование
Исследование проводилось в промышленной лаборатории, в которой установлена кран-балка, имитирующая работу настоящего мостового крана.
Во время эксперимента было записано видео передвижения крана с одновременной процедурой снятия показаний c энкодеров. Графики скорости получены в программе SoMove от Schneider Electric.
Видео записывалось на камеру Canon EOS 1200D с разрешением 1920x1080.
Для детекции тележки используется графическая метка с нарисованным прямоугольником и кругом внутри. Решение не совсем удачное, перед экспериментом мне следовало получше разобраться в метках. Но с помощью контурного анализа (ограничения по площади и соотношению сторон) я все-таки смог детектировать нужный прямоугольник. Также добавлю, что, если объект легко детектировать и можно точно измерить физический размер, графическая метка не нужна.
Алгоритм работы
Метод вычисления расстояния основан на подобие треугольников, которые сходятся на диафрагме объектива.
Замерим площадь метки на бумаге с помощью линейки и площадь метки в кадре с помощью библиотеки opencv. Зная фокусное расстояние, мы можем рассчитать расстояние до объекта.
Проведение эксперимента
Цифровая камера установлена напротив тележки мостового крана. На расстоянии достаточном для того, чтобы угол обзора охватывал всю площадь работы крана.
Схема установки. Вид сверху.
Было записано два тестовых видео, движение по оси x — назад, от камеры и по оси y — сначала влево потом вправо. Значения положения и времени записываются в массив numpy после чего
экспортируются в Matlab, где строятся графики перемещения S(t).
Продифференцировав данные, мы получаем графики скорости V(t).
x_veloc = np.diff(x_position) / np.diff(time_mas)
В связи с тем, что графики перемещения имеют едва заметный шум, связанный с неточной детекцией краев и неравномерным освещением, операция дифференцирования сильно увеличивает этот шум.
Сгладим шум с помощью фильтра 1-го порядка в Matlab, и сравним показания энкодеров с показаниями цифровой камеры.
Графики показывают какую точность измерения дистанции можно получить с помощью одной камеры.
Для того чтобы снизить уровень шумов и получить более плавные графики была разработана вторая версия метки с козырьком и локальным освещением.
В теории это должно позволить снизить шум и тем самым увеличить точность измерений. К сожалению, опробовать новую версию метки еще не получилось.
Для тех кому интересно больше узнать о трекинге объектов на основе контурного анализа, есть хорошая статья Оценка точности методов трекинга для определения 2d-координат и скоростей механических систем по данным цифровой фотосъёмки.
В статье я рассказал про самый простой метод измерения расстояния до объекта и показал, какую точность измерения можно получить. Всем спасибо за внимание.