Passer au contenu principal

Présentation

Le stellarHD expose deux formats vidéo via son interface UVC (USB Video Class) standard :
  • MJPEG — images compressées en JPEG. Idéal pour des fréquences d’images élevées (jusqu’à 60 FPS) et la visualisation en direct.
  • YUYV — vidéo brute 4:2:2 non compressée. Idéal lorsque vous avez besoin des données de pixels originales et non traitées (vision industrielle, photogrammétrie, imagerie scientifique).
Ce guide se concentre sur la capture YUYV (RAW) : comment obtenir de véritables images brutes, les enregistrer sur disque et les convertir pour les inspecter. Il aborde également un point spécifique aux modèles monochromes stellarHD, où seul le canal de luminance (Y) contient de véritables données d’image.
YUYV est non compressé et consomme donc beaucoup plus de bande passante USB que MJPEG. Par conséquent, le mode brut est limité à des fréquences d’images plus faibles à des résolutions plus élevées. Consultez les spécifications techniques du stellarHD pour connaître les combinaisons de résolution/fréquence d’images prises en charge.

Prérequis

Ces commandes nécessitent un ordinateur Linux avec v4l-utils, GStreamer et FFmpeg installés :
sudo apt install v4l-utils ffmpeg \
  libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-tools \
  gstreamer1.0-x gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-plugins-ugly

Comprendre YUYV vs MJPEG

YUYV (non compressé)MJPEG
CompressionAucune (4:2:2 non compressé)Compression JPEG
Cas d’usageDonnées de pixels brutes, analyseFréquence d’images élevée, aperçu en direct
Fréquence d’imagesPlus faible à haute résolutionJusqu’à 60 FPS
Taille de fichierlargeur × hauteur × 2 octets par imageVariable (petite)
Visualisable directementNon (octets bruts)Oui (chaque image est un JPEG)
Dans les caps GStreamer, le format V4L2 YUYV s’écrit YUY2.
« YUYV » est non compressé, mais ce n’est pas du brut capteur. En termes photographiques, raw signifie la mosaïque de Bayer non traitée directement issue du capteur — un échantillon de couleur par pixel, avant dématriçage, balance des blancs ou conversion colorimétrique. YUYV 4:2:2 (YUY2) est différent : c’est la sortie déjà traitée de la caméra — les données de Bayer ont été dématricées sur la caméra, converties dans l’espace colorimétrique YUV et sous-échantillonnées en chrominance (4:2:2 stocke deux échantillons de chrominance pour deux échantillons de luminance). Cela est vrai à la fois pour les modèles couleur et monochromes : la sortie est non compressée, mais elle est tout de même traitée et sous-échantillonnée.Le stellarHD n’expose pas les données Bayer/brut capteur sous-jacentes via UVC, vous ne pouvez donc pas récupérer la mosaïque brute ni exécuter votre propre pipeline de dématriçage. Le « raw » dans ce guide signifie données de pixels non compressées, et non brut capteur.

Étape 1 — Identifier le nœud de périphérique

Lorsque vous branchez un stellarHD, le noyau crée plusieurs nœuds de périphérique V4L2. YUYV et MJPEG sont tous deux exposés sur le premier nœud du groupe.
v4l2-ctl --list-devices
Exemple de sortie :
stellarHD Leader: stellarHD Lea (usb-0000:00:14.0-6):
	/dev/video4   # <-- this node outputs both YUYV and MJPEG
	/dev/video5
	/dev/media2
Dans cet exemple, /dev/video4 est le nœud à utiliser. Remplacez par votre propre nœud dans les commandes ci-dessous.
Confirmez les formats, résolutions et fréquences d’images annoncés par votre caméra avant la capture :
v4l2-ctl -d /dev/video4 --list-formats-ext
Vous devriez voir à la fois les entrées YUYV (4:2:2 non compressé) et MJPG (MJPEG compressé).

Étape 2 — Capturer une seule image RAW

Utilisez v4l2-ctl pour capturer une image YUYV non compressée en pleine résolution :
v4l2-ctl -d /dev/video4 \
  --set-fmt-video=width=1600,height=1200,pixelformat=YUYV \
  --stream-mmap \
  --stream-count=1 \
  --stream-to=frame_1600x1200.yuyv
Cela écrit les octets YUYV bruts directement dans frame_1600x1200.yuyv.

Vérifier la taille de l’image

Une image brute complète doit faire exactement largeur × hauteur × 2 octets :
1600 × 1200 × 2 = 3 840 000 octets (~3,8 Mo)
Si la taille du fichier correspond, vous avez capturé une image brute complète.

Étape 3 — Convertir l’image RAW en PNG

Les octets YUYV bruts ne sont pas directement visualisables. Utilisez FFmpeg pour convertir l’image en PNG à des fins d’inspection :
ffmpeg \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  -i frame_1600x1200.yuyv \
  frame.png
Vous devez indiquer à FFmpeg le format de pixel exact (yuyv422) et la résolution (-video_size) du fichier brut. La vidéo brute n’a pas d’en-tête ; si ces valeurs ne correspondent pas à la capture, l’image apparaîtra déformée ou corrompue.

Modèles stellarHD monochromes

En raison d’une particularité UVC, le stellarHD monochrome annonce sa sortie comme YUYV 4:2:2 même si le capteur n’a aucune information de couleur.
  • Seul le canal Y (luminance) contient la véritable image.
  • Les canaux U et V (chrominance) contiennent des valeurs factices/fixes et peuvent être ignorés.
Si vous convertissez une image monochrome comme une image couleur complète, vous pouvez observer une teinte erronée due aux données de chrominance sans signification. Extrayez uniquement en niveaux de gris :
ffmpeg \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  -i frame_1600x1200.yuyv \
  -vf format=gray \
  mono.png
Cela n’utilise que le canal de luminance et évite une interprétation erronée de la chrominance.

Vérifier que la caméra est réellement monochrome

Lisez directement le fichier brut avec ffplay. Si l’image apparaît naturellement en niveaux de gris, les canaux de chrominance sont constants :
ffplay \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  frame_1600x1200.yuyv

Pipelines GStreamer

Visualiser le flux brut en direct

gst-launch-1.0 \
  v4l2src device=/dev/video4 ! \
  video/x-raw,format=YUY2,width=1600,height=1200,framerate=5/1 ! \
  videoconvert ! \
  autovideosink

Enregistrer une seule image brute sur disque

gst-launch-1.0 -e \
  v4l2src device=/dev/video4 num-buffers=1 ! \
  video/x-raw,format=YUY2,width=1600,height=1200,framerate=5/1 ! \
  filesink location=frame.yuyv

Aperçu plus rapide en MJPEG

Comme YUYV est limité à de faibles fréquences d’images à haute résolution, utilisez MJPEG lorsque vous n’avez besoin que d’un aperçu en temps réel fluide :
gst-launch-1.0 \
  v4l2src device=/dev/video4 ! \
  image/jpeg,width=1600,height=1200,framerate=30/1 ! \
  jpegdec ! \
  videoconvert ! \
  autovideosink

Extraction de la luminance dans OpenCV / Python

Si vous traitez les images brutes en aval et que votre capteur est monochrome, extrayez le canal de luminance plutôt que de traiter l’image comme couleur.
# YUYV frame loaded as a 3-channel array — the Y channel is the real image
gray = frame[:, :, 0]
Ou convertissez explicitement depuis YUY2 :
import cv2

gray = cv2.cvtColor(frame, cv2.COLOR_YUV2GRAY_YUY2)
https://github.com/opencv/opencv/wiki/logo/OpenCV_logo_no_text.png

Guide OpenCV

Consultez notre guide complet sur l’utilisation du stellarHD avec OpenCV.

Dépannage

Le fichier de sortie a une taille incorrecte

Une image brute complète fait exactement largeur × hauteur × 2 octets. Un fichier plus petit signifie généralement que la capture a été interrompue ou que la résolution demandée n’est pas prise en charge en mode YUYV — vérifiez avec v4l2-ctl -d /dev/video4 --list-formats-ext.

L’image convertie est déformée ou illisible

Le -pixel_format et le -video_size transmis à FFmpeg doivent correspondre exactement à la capture. La vidéo brute n’a pas d’en-tête, donc toute discordance corrompt la mise en page.

L’image apparaît teintée sur une caméra monochrome

Les canaux de chrominance ne contiennent aucune donnée réelle sur un capteur monochrome. Reconvertissez avec -vf format=gray (FFmpeg) ou extrayez le canal Y (OpenCV) comme indiqué ci-dessus.

La fréquence d’images YUYV est trop faible

C’est attendu — la vidéo non compressée est gourmande en bande passante. Diminuez la résolution, baissez la fréquence d’images ou passez à MJPEG pour la visualisation en direct.