Интеграция OpenCV с живым 360 видео для робототехники

По мере усовершенствования искусственного интеллекта роботы все чаще используются для освобождения людей от рисков при инспекции опасных мест или от рутины рутинного визуального наблюдения. Чтобы обеспечить определенную автономность принятия решений, на робота часто устанавливаются камеры, подключенные к встроенному компьютеру на базе Linux, такому как NVIDIA Jetson или одноплатный компьютер x86 (SBC).

Если приложению необходима прямая трансляция видео 360 градусов, существуют два подхода. Первый, более сложный подход – использовать несколько камер и сшить видео на компьютере или обработать каждое видеоотдельно. Количество использованных камер зависит от угла обзора каждой камеры. Если робот использует два объектива “рыбий глаз”, способных показывать более 180 градусов, достаточно двух камер. Обычно используют три или четыре камеры.

Более простой подход – использовать потребительскую камеру 360°. На бесплатном и независимом сообществе разработчиков theta360.guide, одна из самых популярных тем, обсуждаемых разработчиками, – как добавить видение 360° к их прототипу робота и подать видео в OpenCV.

Хотя существуют разные способы передачи видео с камеры 360° на компьютер с Linux, наиболее популярным методом является использование USB-кабеля. WiFi и Ethernet не так популярны. Модели RICOH THETA V, X и Z1 могут появляться как USB-веб-камера на компьютере с Linux. Однако для этого требуется некоторая работа на Linux. Компьютеры с MacOS могут использовать камеру RICOH THETA напрямую. Для Windows RICOH предоставляет драйвер. Для Linux RICOH предоставляет модифицированную версию libuvc на GitHub под названием libuvc-theta

Для того чтобы обозначить камеру как видеоустройство для OpenCV, RICOH предоставляет образец программы, libuvc-theta-sample. Его можно использовать с v4l2loopback чтобы сделать устройство /dev/video* доступным для OpenCV.

Для тестирования подключения камеры к компьютеру с Linux, сначала подключите USB-кабель от камеры к компьютеру с Linux и выполните следующие шаги:

Shell

 

git clone https://github.com/ricohapi/libuvc-theta.git
sudo apt install libjpeg-dev
cd libuvc-theta
mkdir build
cd build
cmake ..
make
sudo make install
cd ../..
git clone https://github.com/ricohapi/libuvc-theta-sample.git
cd libuvc-theta-sample/gst
make

# THETA должна быть подключена к компьютеру в режиме прямой трансляции 


./gst_viewer

Видео с камеры 360° отображается с помощью gstreamer

Если сборка не удалась, возможно, вам понадобятся дополнительные библиотеки gstreamer. Это установит все библиотеки.

Shell

 

sudo apt-get install \
    libgstreamer1.0-0 \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    gstreamer1.0-doc \
    gstreamer1.0-tools \
    gstreamer1.0-x \
    gstreamer1.0-alsa \
    gstreamer1.0-gl \
    gstreamer1.0-gtk3 \
    gstreamer1.0-qt5 \
    gstreamer1.0-pulseaudio \
    libgstreamer-plugins-base1.0-dev

Кроме того, Raspberry Pi 4 не будет работать из-за отсутствия поддержки аппаратного декодирования 4K H.264. 

Настройка /dev/video*

Для того чтобы сделать устройство libuvc доступным в качестве видеоустройства, мы можем использовать v4l2loopback. Приложение libuvc-theta-sample будет использовать gstreamer для передачи видео на устройство v4l2.

Если у вас на компьютере есть только одна видеокамера, то перед запуском сборки вам следует изменить эту строку. Ниже приведена строка для компьютера, к которому подключена только веб-камера RICOH THETA:

Plain Text

 

"v4l2sink device=/dev/video0 sync=false";

Доступ из OpenCV

Чтобы проверить, можно ли использовать камеру из OpenCV, начнем с простого изменения размера кадра.

Python

 

import cv2

cap = cv2.VideoCapture(0)

# Проверяем, открыта ли веб-камера корректно
if not cap.isOpened():
    raise IOError("Cannot open webcam")

while True:
    ret, frame = cap.read()
    frame = cv2.resize(frame, None, fx=0.25, fy=0.25, interpolation=cv2.INTER_AREA)
    cv2.imshow('Input', frame)

    c = cv2.waitKey(1)
    if c == 27:
        break

cap.release()
cv2.destroyAllWindows()

Задержка камеры

Задержка – большая проблема в обсуждениях сообщества. Задержка камеры THETA составляет примерно 350 мс. Это слишком много для многих приложений, требующих быстрой реакции робота. Также это слишком много для телеприсутствия, если вы управляете дроном, который движется вокруг препятствий. Задержка вызвана сшивкой двух объективов внутри камеры. Сшивку нельзя отключить на видеопотоке.

Альтернатива v4l2loopback

Поскольку v4l2loopback добавляет сложности и накладные расходы, пакет gstthetauvc можно использовать для доступа к камере напрямую из gstreamer.

Вот тот же тест с использованием gstthetauvc.

Python

 

import cv2
# ниже приведен рабочий конвейер
# cap = cv2.VideoCapture("thetauvcsrc \
#     ! decodebin \
#     ! autovideoconvert \
#     ! video/x-raw,format=BGRx \
#     ! queue ! videoconvert \
#     ! video/x-raw,format=BGR ! queue ! appsink")

# предложение конвейера благодаря nickel110
# попытка принудительного использования аппаратного ускорения
# протестировано с NVIDIA 510.73 на старой GTX 950 на Ubuntu 22.04
cap = cv2.VideoCapture("thetauvcsrc \
    ! queue \
    ! h264parse \
    ! nvdec \
    ! gldownload \
    ! queue \
    ! videoconvert n-threads=0 \
    ! video/x-raw,format=BGR \
    ! queue \
    ! appsink")

if not cap.isOpened():
    raise IOError('Cannot open RICOH THETA')

while True:
    ret, frame = cap.read()
    frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
    cv2.imshow('frame', frame)


    c = cv2.waitKey(1)
    if c == 27:
        break

cap.release()
cv2.destroyAllWindows()

Примеры прямой трансляции видео 360 градусов

Вот несколько примеров использования OpenCV для преобразования цвета и обнаружения границ.

Python

 

# Преобразование в оттенки серого
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Размытие изображения для лучшего обнаружения границ
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0) 
# Обнаружение границ Canny
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Обнаружение границ Canny
# Отображение изображения обнаружения границ Canny
cv2.imshow('Canny Edge Detection', edges) 

Обнаружение живого человека и монитора

Камера имеет две линзы.  Сторона, противоположная кнопке затвора, является задней линзой и должна быть размещена в центре сцены.  Обнаружение объекта наиболее точно, когда объект находится в центре эквиректангулярного вида.

Человек в центре на задней линзе

Однако обнаружение работает довольно хорошо, когда человек находится на краю эквиректангулярного вида, даже ночью. Возможно, вам потребуется обучить свою модель на базе данных изображений с фишай или 360°.

Человек обнаружен на краю эквиректангулярного вида

Улучшение обнаружения

Теперь, когда у вас есть базовое обнаружение в квадратных кадрах с живой видеоподачи 360°, вы можете экспериментировать с различными техниками для улучшения точности. Один из методов заключается в создании нескольких вытянутых сцен из каждого кадра, а затем обнаружении объекта в каждой сцене. Видео 360° Обнаружение объектов (Yolo) в ROS2 rviz2 и KR260 от инженера misoji демонстрирует эту технику хорошо. Существует также версия YOLO, которая была изменена для использования с панорамным видео. Обратитесь к статье PV-YOLO: Модель обнаружения объектов для панорамного видео на основе YOLOv4.

Заключение

Используя потребительскую камеру 360° с полок, вы можете довольно легко превратить 360° видео в USB веб-камеру для программного обеспечения, такого как OpenCV. С 360° видео, доступным либо как видеоустройство, либо через gstreamer, стандартное OpenCV или другое программное обеспечение для обнаружения могут быть использованы на экиректангулярных кадрах прямого видео. Из-за искажения изображения алгоритм обнаружения объектов работает не так хорошо, как в случае с обычной не 360° веб-камерой. Однако, даже без модификаций, вы все равно можете начать с обнаружения.

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

Source:
https://dzone.com/articles/opencv-integration-live-video-for-robotics