Saltar al contenido principal

Descripción general

La stellarHD expone dos formatos de video a través de su interfaz estándar UVC (USB Video Class):
  • MJPEG — fotogramas comprimidos con JPEG. Ideal para frecuencias de imagen altas (hasta 60 FPS) y visualización en vivo.
  • YUYV — video en bruto 4:2:2 sin comprimir. Ideal cuando necesitas los datos de píxel originales y sin procesar (visión artificial, fotogrametría, imagen científica).
Esta guía se centra en la captura YUYV (RAW): cómo obtener fotogramas verdaderamente en bruto, guardarlos en disco y convertirlos para su inspección. También cubre un detalle específico de los modelos stellarHD monocromáticos, donde solo el canal de luminancia (Y) contiene datos de imagen reales.
YUYV no está comprimido, por lo que consume mucho más ancho de banda USB que MJPEG. Por lo tanto, el modo raw está limitado a frecuencias de imagen más bajas en resoluciones altas. Consulta las especificaciones técnicas de stellarHD para conocer las combinaciones de resolución/frecuencia de imagen compatibles.

Requisitos

Estos comandos requieren una computadora con Linux y v4l-utils, GStreamer y FFmpeg instalados:
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 frente a MJPEG

YUYV (sin comprimir)MJPEG
CompresiónNinguna (4:2:2 sin comprimir)Comprimido con JPEG
Caso de usoDatos de píxel en bruto, análisisAlta frecuencia de imagen, vista previa en vivo
Frecuencia de imagenMenor en alta resoluciónHasta 60 FPS
Tamaño de archivoancho × alto × 2 bytes por fotogramaVariable (pequeño)
Visible directamenteNo (bytes en bruto)Sí (cada fotograma es un JPEG)
En los caps de GStreamer, el formato V4L2 YUYV se escribe como YUY2.
“YUYV” no está comprimido, pero no es raw del sensor. En términos de cámara, raw significa el mosaico de Bayer sin procesar directamente del sensor: una muestra de color por píxel, antes del demosaico, balance de blancos o conversión de color. YUYV 4:2:2 (YUY2) es algo diferente: es la salida ya procesada de la cámara — los datos de Bayer se han demosaicado en la cámara, convertido al espacio de color YUV y sub-muestreado en croma (4:2:2 almacena dos muestras de croma por cada dos muestras de luma). Esto es cierto tanto para los modelos en color como monocromáticos: la salida está sin comprimir, pero sigue estando procesada y sub-muestreada.La stellarHD no expone los datos subyacentes de Bayer/raw del sensor a través de UVC, así que no puedes obtener un mosaico en bruto ni ejecutar tu propia canalización de demosaico. En esta guía, “raw” significa datos de píxel sin comprimir, no raw del sensor.

Paso 1 — Identifica el nodo del dispositivo

Cuando conectas una stellarHD, el kernel crea varios nodos de dispositivo V4L2. Tanto YUYV como MJPEG se exponen en el primer nodo del grupo.
v4l2-ctl --list-devices
Ejemplo de salida:
stellarHD Leader: stellarHD Lea (usb-0000:00:14.0-6):
	/dev/video4   # <-- this node outputs both YUYV and MJPEG
	/dev/video5
	/dev/media2
En este ejemplo, /dev/video4 es el nodo a usar. Sustituye tu propio nodo en los comandos siguientes.
Confirma los formatos, resoluciones y frecuencias de imagen que anuncia tu cámara antes de capturar:
v4l2-ctl -d /dev/video4 --list-formats-ext
Deberías ver tanto entradas YUYV (4:2:2 sin comprimir) como MJPG (comprimido con MJPEG).

Paso 2 — Captura un solo fotograma RAW

Usa v4l2-ctl para capturar un fotograma YUYV sin comprimir a resolución completa:
v4l2-ctl -d /dev/video4 \
  --set-fmt-video=width=1600,height=1200,pixelformat=YUYV \
  --stream-mmap \
  --stream-count=1 \
  --stream-to=frame_1600x1200.yuyv
Esto escribe los bytes YUYV en bruto directamente en frame_1600x1200.yuyv.

Verifica el tamaño del fotograma

Un fotograma en bruto completo debería tener exactamente ancho × alto × 2 bytes:
1600 × 1200 × 2 = 3.840.000 bytes (~3,8 MB)
Si el tamaño del archivo coincide, has capturado un fotograma en bruto completo.

Paso 3 — Convierte el fotograma RAW a PNG

Los bytes YUYV en bruto no son visibles directamente. Usa FFmpeg para convertir el fotograma en un PNG para su inspección:
ffmpeg \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  -i frame_1600x1200.yuyv \
  frame.png
Debes indicar a FFmpeg el formato de píxel exacto (yuyv422) y la resolución (-video_size) del archivo raw. El video raw no tiene cabecera, así que si estos valores no coinciden con la captura, la imagen aparecerá torcida o corrupta.

Modelos stellarHD monocromáticos

Debido a una peculiaridad de UVC, la stellarHD monocromática anuncia su salida como YUYV 4:2:2 aunque el sensor no tiene información de color.
  • Solo el canal Y (luminancia) contiene la imagen real.
  • Los canales U y V (croma) son valores ficticios/fijos y pueden ignorarse.
Si conviertes un fotograma monocromático como color completo, es posible que veas un tinte falso proveniente de los datos de croma sin sentido. Extrae solo la escala de grises:
ffmpeg \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  -i frame_1600x1200.yuyv \
  -vf format=gray \
  mono.png
Esto utiliza solo el canal de luminancia y evita una interpretación de croma incorrecta.

Verifica que la cámara sea realmente monocromática

Reproduce el archivo raw directamente con ffplay. Si la imagen aparece en escala de grises de forma natural, los canales de croma son constantes:
ffplay \
  -f rawvideo \
  -pixel_format yuyv422 \
  -video_size 1600x1200 \
  frame_1600x1200.yuyv

Pipelines de GStreamer

Ver el flujo raw en vivo

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

Guardar un fotograma raw en disco

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

Vista previa más rápida con MJPEG

Como YUYV está limitado a frecuencias de imagen bajas en alta resolución, usa MJPEG cuando solo necesites una vista previa fluida en tiempo real:
gst-launch-1.0 \
  v4l2src device=/dev/video4 ! \
  image/jpeg,width=1600,height=1200,framerate=30/1 ! \
  jpegdec ! \
  videoconvert ! \
  autovideosink

Extraer la luminancia en OpenCV / Python

Si procesas fotogramas raw en etapas posteriores y tu sensor es monocromático, extrae el canal de luminancia en lugar de tratar el fotograma como color.
# YUYV frame loaded as a 3-channel array — the Y channel is the real image
gray = frame[:, :, 0]
O convierte explícitamente desde YUY2:
import cv2

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

Guía de OpenCV

Consulta nuestra guía completa sobre el uso de la stellarHD con OpenCV.

Solución de problemas

El archivo de salida tiene un tamaño incorrecto

Un fotograma raw completo tiene exactamente ancho × alto × 2 bytes. Un archivo más pequeño suele significar que la captura se interrumpió o que la resolución solicitada no es compatible en modo YUYV — comprueba v4l2-ctl -d /dev/video4 --list-formats-ext.

La imagen convertida está torcida o distorsionada

El -pixel_format y -video_size pasados a FFmpeg deben coincidir exactamente con la captura. El video raw no tiene cabecera, así que cualquier discrepancia corrompe el diseño.

La imagen se ve tintada en una cámara monocromática

Los canales de croma no contienen datos reales en un sensor monocromático. Vuelve a convertir con -vf format=gray (FFmpeg) o extrae el canal Y (OpenCV) como se muestra arriba.

La frecuencia de imagen YUYV es demasiado baja

Es lo esperado — el video sin comprimir consume mucho ancho de banda. Reduce la resolución, baja la frecuencia de imagen o cambia a MJPEG para la visualización en vivo.