add dora-webcam node
validate / validate (push) Successful in 59m15s

Captures frames from a V4L2 camera and publishes them as std/media/v1/Image:
an Arrow struct of width, height, encoding and data, so a receiver needs
nothing from the message metadata. For a compressed encoding the recorded
dimensions are the image's, not the length of the payload.

Based on opencv-video-capture from dora-hub, with three changes. The output is
the typed image struct rather than a flat UInt8 buffer plus metadata. Camera
selection by id reads /dev/v4l/by-id/ only; the upstream macOS system_profiler
and Windows PowerShell enumeration is not carried. CAPTURE_FRAMES bounds a run
so a test ends on its own, in place of upstream's ten-second CI cutoff -- a
timeout would have made the CI step exit non-zero.

CI=true keeps a failed capture from raising, publishing a labelled black frame
instead, which is what lets dataflow.yml run on a machine with no camera.

Two dataflows, run one at a time, as dora has no cross-dataflow wiring:
dataflow.yml is the camera alone and the CI gate; dataflow_view.yml wires it
into dora-image-view and is not run by CI, since it fetches that node over the
network and needs a tag to exist there.
This commit is contained in:
2026-09-15 06:04:25 -03:00
commit 3c0e0f327d
16 changed files with 1647 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
# The camera alone, and the CI gate: with CI=true a failed read publishes a
# placeholder frame rather than raising, so this runs on a machine with no
# camera.
strict_types: true
nodes:
- id: camera
path: dora-webcam
build: pip install .
inputs:
tick: dora/timer/millis/33
outputs:
- image
# Nothing consumes the frames here; the point is that the node opens, encodes
# and publishes. dataflow_view.yml is the pair that shows them.