8. Битва за скорость и карта в реальном времени, 8_dm_video.py

Назначение восьмого скрипта

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

Исходный код: https://github.com/realizator/3dberry-turorial/blob/master/8_dm_video.py

 

 

Скрипт делает следующее:

  • Загружает все параметры (резки картинки на стереопару, настройки калибровки)
  • Загружает указанную картинку для построения карты глубин
  • Строит карту глубин, переводит ее в цветной формат
  • Выводит на экран картинку с камеры в реальном времени
  • Рисует полученную карту глубин поверх видео, на левой части изображения
 
Запуск скрипта на Raspberry или на десктопе командой:

python 8_dm_video.py

Время скрипта сейчас ограничено количеством построений карты глубин, по умолчанию это 100. Данное значение можно поправить в коде в последнем цикле. Обратите внимание, что скрипт работает в полноэкранном режиме - вы перестанете видеть окошки и консоль. Не паникуйте - текущее выполнение можно прервать сочетанием Alt+F4. 

Боевой раскрас

Как упомянуто в прошлом уроке, карта глубин на самом деле получается черно-белая. Но в OpenCV есть удобные инструменты быстрого "раскраса" черно-белого изображения в нужные цветовые оттенки. Применение этих функций хорошо описано вот тут.

Вот возможности раскраски в OpenCV:

Карта глубин изначально имеет значения цвета в каждой точке от 0 до 255, где 0 это черный, а 255 белый цвет. При "перекраске" для каждого значения серого цвета берется соответствующее из заданной линейки цветов. Мы для раскраски используем палитру COLORMAP_JET, на приведенной картинке она третья сверху. При ее применении значению 0 соответствует самый левый цвет (темно-синий), при 255 самый правый (красный).

В коде скрипта волшебное превращение делается простой строчкой:

disparity_color = cv2.applyColorMap(disparity_grayscale, cv2.COLORMAP_JET)

Последняя тонкость: после конверсии мы получаем картинку в BGR (Blue-Green-Red), а вывод на экран идет в формате RGB (Red-Green-Blue), поэтому перед показом мы конвертируем цвета в правильные следующей строчкой:

disparity = cv2.cvtColor (disparity, cv2.COLOR_BGR2RGB)

Немного о скорости

Давайте вспомним исходные условия наших уроков. Мы работаем на скриптовом языке Python, который не отличается высокой производительностью, но предельно прост в освоении. Поэтому на данном этапе ждать сверхбыстрой работы не приходится. Но мы попробуем выжать максимум из того, что у нас имеется. На данном этапе в битве за скорость пройдены следующие этапы:

  1. На Raspberry Pi первого поколения карта с изображения 1280х720 строится около 4,5 секунд
  2. На Raspberry Pi 2 карта строится 2,5 секунды. Это при условии, что библиотеки компьютерного зрения скомпилированы без поддержки многопроцессорности.
  3. На Raspberry Pi 2 при условии, что в OpenCV включена поддержка многоядерности, карта из картинки 1280х720 строится 1,5 секунды. Это не в 4 раза быстрее, как ожидалось, но прирост в скорости примерно на 80% имеется. Для справки - выложенная для скачивания и прилагаемая в комплекте прошивка сделана с учетом многоядерности второй Raspberry.
  4. Теоретически уменьшение разрешения в 2 раза (до 640Х360) должно дать 4-кратный рост скорости, т.е. примерно 0,4 секунды на построение карты. Практические эксперименты показали, что это так и есть - построение карты занимает от 0,3 до 0,4 секунд, или 2-3 FPS.

Результат, который показан на видео, получен при разрешении 640х360. Соответственно для настройки системы необходимо пройти все скрипты начиная с 1-го, предварительно заменив в первых строчках кода (1280 на 640 и 720 на 360).

 

У нас с вами есть несколько направлений для дальнейших исследований.

Первое - это продолжить работать с языком Python и сделать прикладной скрипт "дальномер для робота". Этот скрипт появится в наших уроках в ближайшее время. 

Второй путь - это перенос всех наработок на язык С, а далее оптимизация кода под использование продвинутых возможностей GPU малины (видеопроцессора). Это направление мы сейчас тоже прорабатываем. Следите за новостями! :-)