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:
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.
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:
"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.
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.
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.
# 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