À mesure que l’intelligence artificielle devient de plus en plus avancée, les robots sont de plus en plus utilisés pour libérer les humains des risques liés à l’inspection de lieux dangereux ou à la monotonie de la surveillance visuelle routinière. Pour offrir un certain degré de décision autonome, le robot a souvent des caméras connectées à un ordinateur Linux embarqué tel qu’un NVIDIA Jetson ou un ordinateur monocarte x86 (SBC).
Si l’application bénéficie d’une vidéo live à 360 degrés, il existe deux approches. La première approche, plus difficile, consiste à utiliser plusieurs caméras et à assembler la vidéo sur l’ordinateur ou à traiter chaque flux vidéo séparément. Le nombre de caméras utilisé dépend du champ de vision de chaque caméra. Si le robot utilise deux lentilles fisheye qui peuvent montrer plus de 180 degrés, seules deux caméras sont nécessaires. Il est courant d’utiliser trois ou quatre caméras.
Une approche plus simple consiste à utiliser une caméra grand angle grand public. Sur la communauté de développeurs theta360.guide libre et indépendante, l’un des sujets les plus populaires discutés par les développeurs est comment ajouter une vision à 360 degrés à leur prototype de robot et transmettre la vidéo à OpenCV.
Bien qu’il existe différentes façons de transférer la vidéo de la caméra 360° vers l’ordinateur Linux, la méthode la plus populaire est d’utiliser un câble USB. Le WiFi et l’Ethernet ne sont pas aussi populaires. Les modèles RICOH THETA V, X et Z1 peuvent apparaître comme une webcam USB pour l’ordinateur Linux. Cependant, un peu de travail est nécessaire sur Linux. Les ordinateurs MacOS peuvent utiliser directement la caméra RICOH THETA. Pour Windows, RICOH fournit un pilote. Pour Linux, RICOH propose une version modifiée de libuvc sur GitHub appelée libuvc-theta.
Pour exposer la caméra comme un dispositif vidéo à OpenCV, RICOH fournit un programme d’exemple, libuvc-theta-sample. Cela peut être utilisé avec v4l2loopback pour rendre un dispositif /dev/video*
disponible pour OpenCV.
Pour tester la connexion de la caméra à l’ordinateur Linux, connectez d’abord un câble USB de la caméra à l’ordinateur Linux et exécutez ces étapes :
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
# La THETA doit être branchée à votre ordinateur et en
# mode de diffusion en direct
./gst_viewer
Caméra vidéo 360° affichée avec gstreamer
Si la compilation échoue, vous pourriez avoir besoin de bibliothèques gstreamer supplémentaires. Cela installera toutes les bibliothèques.
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
De plus, un Raspberry Pi 4 ne fonctionnera pas en raison d’un manque de support pour le décodage matériel 4K H.264.
Configuration de /dev/video*
Pour rendre le périphérique libuvc disponible en tant que périphérique vidéo, nous pouvons utiliser v4l2loopback. L’application libuvc-theta-sample utilisera gstreamer pour envoyer la vidéo vers v4l2.
Si vous n’avez qu’une seule caméra vidéo sur votre ordinateur, vous devriez modifier cette ligne avant d’exécuter la compilation. La ligne ci-dessous est pour un ordinateur avec le RICOH THETA connecté en tant que seule webcam :
"v4l2sink device=/dev/video0 sync=false";
Accès depuis OpenCV
Pour tester si la caméra peut être utilisée depuis OpenCV, commençons par un simple redimensionnement de trame.
import cv2
cap = cv2.VideoCapture(0)
# Vérifiez si la webcam est correctement ouverte
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()
Latence de la caméra
La latence est un gros problème dans les discussions de la communauté. La latence de la caméra THETA est d’environ 350ms. C’est trop élevé pour de nombreuses applications qui nécessitent une réactivité rapide du robot. C’est également trop élevé pour la téléprésence si vous contrôlez un drone qui se déplace autour d’obstacles. La latence est due à l’assemblage des deux lentilles dans la caméra. L’assemblage ne peut pas être désactivé sur le flux vidéo.
Alternative à v4l2loopback
Comme v4l2loopback ajoute de la complexité et des frais généraux, le package gstthetauvc peut être utilisé pour accéder à la caméra directement depuis gstreamer.
Voici le même test en utilisant gstthetauvc.
import cv2
# pipeline ci-dessous a fonctionné
# cap = cv2.VideoCapture("thetauvcsrc \
# ! decodebin \
# ! autovideoconvert \
# ! video/x-raw,format=BGRx \
# ! queue ! videoconvert \
# ! video/x-raw,format=BGR ! queue ! appsink")
# suggestion de pipeline grâce à nickel110
# tentative de forcer l'accélération matérielle
# testé avec NVIDIA 510.73 avec un ancien GTX 950 sur 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()
Exemples de flux vidéo 360 en direct
Voici quelques exemples d’utilisation d’OpenCV pour la transformation des couleurs et la détection des bords.
# Convertir en niveaux de gris
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Flouter l'image pour une meilleure détection des bords
img_blur = cv2.GaussianBlur(img_gray, (3,3), 0)
# Détection de bord Canny
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) # Détection de bord Canny
# Afficher l'image de détection des bords Canny
cv2.imshow('Canny Edge Detection', edges)
Détection de personne en direct et de moniteur.
La caméra a deux lentilles. Le côté opposé au bouton de l’obturateur est la lentille arrière et sera placé au centre de la scène. La détection d’objets est la plus précise lorsque l’objet est centré dans la vue équirectangulaire.
Humain centré sur la lentille arrière
Cependant, la détection fonctionne raisonnablement bien lorsque l’humain est à la limite de la vue équirectangulaire, même la nuit. Vous devrez peut-être entraîner votre modèle sur une base de données d’images fisheye ou 360°.
Humain détecté à la limite de la vue équirectangulaire
Amélioration de la détection
Maintenant que vous avez la détection de base fonctionnant dans des images équirectangulaires provenant d’un flux vidéo 360° en direct, vous pouvez expérimenter différentes techniques pour améliorer la précision. Une méthode consiste à créer plusieurs scènes aplaties à partir de chaque image, puis à détecter l’objet dans chaque scène. La vidéo Détection d’objets 360° (Yolo) dans ROS2 rviz2 et KR260 par l’ingénieur misoji fournit une bonne démonstration de cette technique. Il existe également une version de YOLO qui a été modifiée pour être utilisée avec des vidéos panoramiques. Référez-vous à l’article PV-YOLO : Un modèle de détection d’objets pour vidéo panoramique basé sur YOLOv4.
Conclusion
En utilisant une caméra 360° grand public, vous pouvez assez facilement faire en sorte que la vidéo à 360° apparaisse comme une webcam USB pour des logiciels tels que OpenCV. Avec la vidéo à 360° accessible soit en tant que périphérique vidéo, soit accessible via gstreamer, OpenCV standard ou d’autres logiciels de détection peuvent être utilisés sur les trames équirectangulaires de la vidéo en direct. En raison de la distorsion de l’image, l’algorithme de détection d’objets ne fonctionnera pas aussi bien que par rapport à une webcam standard non à 360°. Cependant, même sans modification, vous pouvez quand même commencer avec certaines détections.
Pour réellement utiliser la détection pour autre chose qu’un projet éducatif ou de recherche, vous devrez vous pencher sur des techniques pour améliorer la reconnaissance des objets dans la vue équirectangulaire déformée.
Source:
https://dzone.com/articles/opencv-integration-live-video-for-robotics