Zum Hauptinhalt springen

Übersicht

Die stellarHD stellt über ihre standardmäßige UVC-Schnittstelle (USB Video Class) zwei Videoformate bereit:
  • MJPEG — JPEG-komprimierte Frames. Am besten geeignet für hohe Bildraten (bis zu 60 FPS) und Live-Anzeige.
  • YUYV — unkomprimiertes 4:2:2-Rohvideo. Am besten geeignet, wenn Sie die originalen, unverarbeiteten Pixeldaten benötigen (maschinelles Sehen, Photogrammetrie, wissenschaftliche Bildgebung).
Diese Anleitung konzentriert sich auf die YUYV-(RAW-)Aufnahme: wie Sie echte Rohframes erfassen, auf Festplatte speichern und zur Inspektion konvertieren. Sie behandelt außerdem einen Detailaspekt speziell zu Monochrom-stellarHD-Modellen, bei denen nur der Luminanzkanal (Y) echte Bilddaten enthält.
YUYV ist unkomprimiert und verbraucht daher weit mehr USB-Bandbreite als MJPEG. Aus diesem Grund ist der Rohmodus bei höheren Auflösungen auf niedrigere Bildraten begrenzt. Sehen Sie in den technischen Spezifikationen der stellarHD nach, welche Kombinationen aus Auflösung und Bildrate unterstützt werden.

Voraussetzungen

Diese Befehle erfordern einen Linux-Computer mit installierten Tools v4l-utils, GStreamer und FFmpeg:
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

YUYV vs. MJPEG verstehen

YUYV (unkomprimiert)MJPEG
KompressionKeine (4:2:2 unkomprimiert)JPEG-komprimiert
AnwendungsfallRohpixeldaten, AnalyseHohe Bildrate, Live-Vorschau
BildrateNiedriger bei hoher AuflösungBis zu 60 FPS
DateigrößeBreite × Höhe × 2 Byte pro FrameVariabel (klein)
Direkt anzeigbarNein (Rohbytes)Ja (jeder Frame ist ein JPEG)
In GStreamer-Caps wird das V4L2-Format YUYV als YUY2 geschrieben.
„YUYV” ist unkomprimiert, aber nicht sensor-roh. In Kamerabegriffen bedeutet raw das unverarbeitete Bayer-Mosaik direkt vom Sensor – ein Farbmuster pro Pixel, vor Demosaicing, Weißabgleich oder Farbkonvertierung. YUYV 4:2:2 (YUY2) ist etwas anderes: Es ist die bereits verarbeitete Ausgabe der Kamera – die Bayer-Daten wurden in der Kamera demosaikt, in den YUV-Farbraum konvertiert und chroma-unterabgetastet (4:2:2 speichert zwei Chroma-Samples auf je zwei Luma-Samples). Dies gilt sowohl für die Farb- als auch für die Monochrom-Modelle: Die Ausgabe ist unkomprimiert, aber dennoch verarbeitet und unterabgetastet.Die stellarHD stellt die zugrunde liegenden Bayer-/Sensor-Rohdaten nicht über UVC bereit, sodass Sie kein rohes Mosaik abrufen oder Ihre eigene Demosaicing-Pipeline betreiben können. Das „raw” in dieser Anleitung meint unkomprimierte Pixeldaten, nicht Sensor-Raw.

Schritt 1 – Geräteknoten identifizieren

Wenn Sie eine stellarHD anschließen, erstellt der Kernel mehrere V4L2-Geräteknoten. Sowohl YUYV als auch MJPEG werden über den ersten Knoten der Gruppe bereitgestellt.
v4l2-ctl --list-devices
Beispielausgabe:
stellarHD Leader: stellarHD Lea (usb-0000:00:14.0-6):
	/dev/video4   # <-- dieser Knoten gibt sowohl YUYV als auch MJPEG aus
	/dev/video5
	/dev/media2
In diesem Beispiel ist /dev/video4 der zu verwendende Knoten. Ersetzen Sie ihn in den folgenden Befehlen durch Ihren eigenen Knoten.
Bestätigen Sie die von Ihrer Kamera angebotenen Formate, Auflösungen und Bildraten, bevor Sie aufnehmen:
v4l2-ctl -d /dev/video4 --list-formats-ext
Sie sollten sowohl YUYV- (unkomprimiert 4:2:2) als auch MJPG-Einträge (MJPEG-komprimiert) sehen.

Schritt 2 – Ein einzelnes RAW-Bild aufnehmen

Verwenden Sie v4l2-ctl, um einen unkomprimierten YUYV-Frame in voller Auflösung aufzunehmen:
v4l2-ctl -d /dev/video4 \
  --set-fmt-video=width=1600,height=1200,pixelformat=YUYV \
  --stream-mmap \
  --stream-count=1 \
  --stream-to=frame_1600x1200.yuyv
Dadurch werden die rohen YUYV-Bytes direkt in frame_1600x1200.yuyv geschrieben.

Framegröße überprüfen

Ein vollständiger Rohframe sollte exakt Breite × Höhe × 2 Byte groß sein:
1600 × 1200 × 2 = 3.840.000 Byte (~3,8 MB)
Wenn die Dateigröße übereinstimmt, haben Sie einen vollständigen Rohframe aufgenommen.

Schritt 3 – Den RAW-Frame in PNG konvertieren

Rohe YUYV-Bytes sind nicht direkt anzeigbar. Verwenden Sie FFmpeg, um den Frame zur Inspektion in ein PNG umzuwandeln:
ffmpeg \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  -i frame_1600x1200.yuyv \
  frame.png
Sie müssen FFmpeg das exakte Pixelformat (yuyv422) und die Auflösung (-video_size) der Rohdatei angeben. Rohvideos haben keinen Header. Wenn diese Werte nicht mit der Aufnahme übereinstimmen, erscheint das Bild verzerrt oder beschädigt.

Monochrom-Modelle der stellarHD

Aufgrund einer UVC-Eigenheit gibt die monochrome stellarHD ihre Ausgabe als YUYV 4:2:2 an, obwohl der Sensor keine Farbinformationen besitzt.
  • Nur der Kanal Y (Luminanz) enthält das echte Bild.
  • Die Kanäle U und V (Chroma) sind Dummy-/feste Werte und können ignoriert werden.
Wenn Sie einen monochromen Frame als Vollfarbe konvertieren, kann eine falsche Färbung durch die bedeutungslosen Chromadaten auftreten. Extrahieren Sie ausschließlich Graustufen:
ffmpeg \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  -i frame_1600x1200.yuyv \
  -vf format=gray \
  mono.png
Dabei wird nur der Luminanzkanal verwendet und eine fehlerhafte Chroma-Interpretation vermieden.

Bestätigen, dass die Kamera tatsächlich monochrom ist

Spielen Sie die Rohdatei direkt mit ffplay ab. Wenn das Bild von Natur aus in Graustufen erscheint, sind die Chromakanäle konstant:
ffplay \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  frame_1600x1200.yuyv

GStreamer-Pipelines

Den Live-Rohstream anzeigen

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

Einen Rohframe auf Festplatte speichern

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

Schnellere Vorschau mit MJPEG

Da YUYV bei hoher Auflösung auf niedrige Bildraten begrenzt ist, verwenden Sie MJPEG, wenn Sie lediglich eine flüssige Echtzeitvorschau benötigen:
gst-launch-1.0 \
  v4l2src device=/dev/video4 ! \
  image/jpeg,width=1600,height=1200,framerate=30/1 ! \
  jpegdec ! \
  videoconvert ! \
  autovideosink

Luminanz in OpenCV / Python extrahieren

Wenn Sie Rohframes weiterverarbeiten und Ihr Sensor monochrom ist, extrahieren Sie den Luminanzkanal, anstatt den Frame als Farbe zu behandeln.
# YUYV frame loaded as a 3-channel array — the Y channel is the real image
gray = frame[:, :, 0]
Oder konvertieren Sie explizit von YUY2:
import cv2

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

OpenCV-Anleitung

Siehe unsere vollständige Anleitung zur Verwendung der stellarHD mit OpenCV.

Fehlerbehebung

Die Ausgabedatei hat die falsche Größe

Ein vollständiger Rohframe ist exakt Breite × Höhe × 2 Byte groß. Eine kleinere Datei bedeutet in der Regel, dass die Aufnahme unterbrochen wurde oder die angeforderte Auflösung im YUYV-Modus nicht unterstützt wird – prüfen Sie mit v4l2-ctl -d /dev/video4 --list-formats-ext.

Das konvertierte Bild ist verzerrt oder unleserlich

Die an FFmpeg übergebenen Werte für -pixel_format und -video_size müssen exakt mit der Aufnahme übereinstimmen. Rohvideos haben keinen Header, sodass jede Abweichung das Layout zerstört.

Das Bild wirkt bei einer Monochromkamera eingefärbt

Die Chromakanäle enthalten bei einem Monochromsensor keine echten Daten. Konvertieren Sie erneut mit -vf format=gray (FFmpeg) oder extrahieren Sie den Y-Kanal (OpenCV) wie oben gezeigt.

Die YUYV-Bildrate ist zu niedrig

Das ist zu erwarten – unkomprimiertes Video ist bandbreitenintensiv. Reduzieren Sie die Auflösung, senken Sie die Bildrate oder wechseln Sie für die Live-Anzeige zu MJPEG.