Integrazione di OpenCV con Video Live a 360 gradi per la Robotica

Man mano che l’intelligenza artificiale diventa più avanzata, i robot vengono sempre più utilizzati per liberare gli esseri umani dai rischi dell’ispezione di luoghi pericolosi o dalla noia della sorveglianza visiva di routine. Per fornire un certo grado di decisione autonoma, il robot ha spesso telecamere collegate a un computer Linux incorporato come un NVIDIA Jetson o un computer a scheda singola x86 (SBC).

Se l’applicazione beneficia di video live a 360 gradi, ci sono due approcci. Il primo, più difficile, consiste nell’utilizzare più telecamere e cucire insieme il video sul computer o processare separatamente ciascun flusso video. Il numero di telecamere utilizzato dipende dal campo visivo di ciascuna telecamera. Se il robot utilizza due lenti fish-eye che possono mostrare più di 180 gradi, sono necessarie solo due telecamere. È comune utilizzare tre o quattro telecamere.

Un approccio più semplice consiste nell’utilizzare una telecamera consumer a 360°. Sulla comunità di sviluppatori theta360.guide, uno dei temi più popolari di discussione tra gli sviluppatori è come aggiungere la visione a 360° al loro prototipo di robot e alimentare il video in OpenCV.

Sebbene ci siano diversi modi per trasferire il video dalla camera 360° al computer Linux, il metodo più popolare è utilizzare un cavo USB. WiFi ed Ethernet non sono così popolari. I modelli RICOH THETA V, X e Z1 possono apparire come una webcam USB al computer Linux. Tuttavia, è necessario un po’ di lavoro su Linux. I computer MacOS possono utilizzare direttamente la camera RICOH THETA. Per Windows, RICOH fornisce un driver. Per Linux, RICOH fornisce una versione modificata di libuvc su GitHub chiamata libuvc-theta.

Per esporre la camera come un dispositivo video a OpenCV, RICOH fornisce un programma di esempio, libuvc-theta-sample. Questo può essere utilizzato con v4l2loopback per rendere disponibile un dispositivo /dev/video* a OpenCV.

Per testare la connessione tra la camera e il computer Linux, prima collegare un cavo USB dalla camera al computer Linux e seguire questi passaggi:

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 deve essere collegata al computer e in 
# modalità streaming live

./gst_viewer

camera video 360° visualizzata con gstreamer

Se la compilazione fallisce, potrebbe essere necessario installare librerie gstreamer aggiuntive. Questo installerà tutte le librerie.

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

Inoltre, un Raspberry Pi 4 non funzionerà a causa della mancanza di supporto per la decodifica hardware H.264 4K.

Impostazione di /dev/video*

Per rendere disponibile il dispositivo libuvc come dispositivo video, possiamo utilizzare v4l2loopback. L’applicazione libuvc-theta-sample utilizzerà gstreamer per inviare il video a v4l2.

Se hai solo una telecamera video sul tuo computer, dovresti modificare questa linea prima di eseguire la build. La riga sottostante è per un computer con il RICOH THETA connesso come unica webcam:

Plain Text

 

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

Accesso Da OpenCV

Per verificare se la telecamera può essere utilizzata da OpenCV, iniziamo con un semplice ridimensionamento del frame.

Python

 

import cv2

cap = cv2.VideoCapture(0)

# Controlla se la webcam è stata aperta correttamente
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()

Latenza della Telecamera

La latenza è un grosso problema nelle discussioni della comunità. La latenza della telecamera THETA è di circa 350 ms. Questo è troppo alto per molte applicazioni che richiedono al robot di reagire rapidamente. È anche troppo alto per la telepresenza se stai controllando un drone che si muove intorno agli ostacoli. La latenza è dovuta alla fusione delle due lenti direttamente nella telecamera. La fusione non può essere disattivata sul feed video.

Alternativa a v4l2loopback

Poiché v4l2loopback aggiunge complessità e sovraccarico, il gstthetauvc pacchetto può essere utilizzato per accedere direttamente alla telecamera da gstreamer.

Ecco lo stesso test utilizzando gstthetauvc.

Python

 

import cv2
# la pipeline qui sotto ha funzionato
# cap = cv2.VideoCapture("thetauvcsrc \
#     ! decodebin \
#     ! autovideoconvert \
#     ! video/x-raw,format=BGRx \
#     ! queue ! videoconvert \
#     ! video/x-raw,format=BGR ! queue ! appsink")

# suggerimento per la pipeline grazie a nickel110
# tentativo di forzare l'accelerazione hardware
# testato con NVIDIA 510.73 con vecchia GTX 950 su 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()

Esempi di Feed Video Live a 360 Gradi

Qui ci sono alcuni esempi di utilizzo di OpenCV per la trasformazione dei colori e il rilevamento dei bordi.

Python

 

# Convertire in scala di grigi
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Sfocare l'immagine per un migliore rilevamento dei bordi
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0) 
# Rilevamento dei bordi di Canny
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Rilevamento dei bordi di Canny
# Visualizzare l'immagine del Rilevamento dei Bordi di Canny
cv2.imshow('Canny Edge Detection', edges) 

Rilevamento di persone in diretta e monitor.

La telecamera ha due lenti. Il lato opposto al pulsante di scatto è la lente posteriore e sarà posizionata al centro della scena. Il rilevamento degli oggetti è più accurato quando l’oggetto è centrato nella vista equirettangolare.

Umano centrato sulla lente posteriore

Tuttavia, il rilevamento funziona ragionevolmente bene quando l’umano è al bordo della vista equirettangolare, anche di notte. Potrebbe essere necessario addestrare il tuo modello su un database di immagini fisheye o a 360°.

Umano rilevato al bordo della vista equirettangolare

Migliorare il Rilevamento

Ora che hai il rilevamento di base funzionante in fotogrammi equirettangolari da un feed video 360° dal vivo, puoi sperimentare diverse tecniche per migliorare la precisione. Un metodo è creare più scene appiattite da ciascun fotogramma e poi rilevare l’oggetto in ciascuna scena. Il video 360° Object Detect(Yolo) in ROS2 rviz2 e KR260 dell’ingegnere misoji fornisce una buona dimostrazione di questa tecnica. Esiste anche una versione di YOLO che è stata modificata per l’uso con video panoramici. Consulta il documento PV-YOLO: Un Modello di Rilevamento Oggetti per Video Panoramici basato su YOLOv4.

Conclusione

Utilizzando una camera 360° commerciale, puoi facilmente fare in modo che il video a 360° appaia come una webcam USB per software come OpenCV. Con il video a 360° accessibile sia come dispositivo video che attraverso gstreamer, è possibile utilizzare software di rilevamento standard come OpenCV sui fotogrammi equirettangolari del video in diretta. A causa della distorsione dell’immagine, l’algoritmo di rilevamento degli oggetti non funzionerà altrettanto bene rispetto a una webcam standard non 360°. Tuttavia, anche senza modifiche, puoi comunque iniziare con qualche rilevamento.

Per utilizzare effettivamente il rilevamento per più di un progetto educativo o di ricerca, dovrai considerare tecniche per migliorare il riconoscimento degli oggetti nella vista equirettangolare distorta.

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