As a developer debugging a dora vision pipeline,
I want a node that displays a video stream with bounding boxes and text drawn over it,
so that I can see what the pipeline is producing without writing frames to disk or adding a viewer to every node.
Requirements
Display a video stream in a window, redrawing on every image event.
Overlay bounding boxes (rectangle plus label, conf) and a text caption, both updated by their own inputs and drawn on the next redraw.
Accept the image encodings a dora camera can emit: bgr8, rgb8, jpeg/jpg/jpe/bmp/webp/png, yuv420, avif.
Accept both xyxy and xywh bounding-box formats.
Optional resizing of the displayed frame via PLOT_WIDTH/PLOT_HEIGHT.
Run headless in CI: decode every input but open no window.
Install with no system packages and no compiler, on linux-aarch64 (Jetson) and linux-x86_64 alike.
Ship a dora 1.0 node manifest so a consumer's dataflow fails validation on a wiring mistake rather than at runtime.
Acceptance Criteria
uv sync installs the node on aarch64 and x86_64 without apt packages or a compiler
Every listed encoding decodes to a BGR frame, verified by tests
xywh boxes are converted to xyxy corners
CI=true suppresses the window while still decoding every input
dora validate dataflow.yml passes under strict_types: true
Tests and lint run without a camera, a dataflow or a display
Notes
Based on opencv-plot from dora-hub, brought up to the dora 1.0 node contract and packaged with uv.
The node is deliberately Python rather than Rust. The opencv Rust crate generates its bindings from the OpenCV headers installed on the build machine, so it requires libopencv-dev and libclang-dev per machine and per architecture and does not cross-compile — which fails the multiarch requirement above. opencv-python ships prebuilt wheels for every target instead, and AVIF support comes from pillow-avif-plugin rather than OpenCV, which cannot decode it before 4.10.
Intended first consumer: liria/dora-zed, whose image_bgr output already carries the width, height and encoding metadata this node expects.
# Feature: OpenCV plot node for dora dataflows
## User Story
As a developer debugging a dora vision pipeline,
I want a node that displays a video stream with bounding boxes and text drawn over it,
so that I can see what the pipeline is producing without writing frames to disk or adding a viewer to every node.
## Requirements
- Display a video stream in a window, redrawing on every `image` event.
- Overlay bounding boxes (rectangle plus `label, conf`) and a text caption, both updated by their own inputs and drawn on the next redraw.
- Accept the image encodings a dora camera can emit: `bgr8`, `rgb8`, `jpeg`/`jpg`/`jpe`/`bmp`/`webp`/`png`, `yuv420`, `avif`.
- Accept both `xyxy` and `xywh` bounding-box formats.
- Optional resizing of the displayed frame via `PLOT_WIDTH`/`PLOT_HEIGHT`.
- Run headless in CI: decode every input but open no window.
- Install with no system packages and no compiler, on linux-aarch64 (Jetson) and linux-x86_64 alike.
- Ship a dora 1.0 node manifest so a consumer's dataflow fails validation on a wiring mistake rather than at runtime.
## Acceptance Criteria
- [ ] `uv sync` installs the node on aarch64 and x86_64 without apt packages or a compiler
- [ ] Every listed encoding decodes to a BGR frame, verified by tests
- [ ] `xywh` boxes are converted to `xyxy` corners
- [ ] `CI=true` suppresses the window while still decoding every input
- [ ] `dora validate dataflow.yml` passes under `strict_types: true`
- [ ] Tests and lint run without a camera, a dataflow or a display
## Notes
Based on [`opencv-plot`](https://github.com/dora-rs/dora-hub/tree/main/node-hub/opencv-plot) from dora-hub, brought up to the dora 1.0 node contract and packaged with `uv`.
The node is deliberately Python rather than Rust. The `opencv` Rust crate generates its bindings from the OpenCV headers installed on the build machine, so it requires `libopencv-dev` and `libclang-dev` per machine and per architecture and does not cross-compile — which fails the multiarch requirement above. `opencv-python` ships prebuilt wheels for every target instead, and AVIF support comes from `pillow-avif-plugin` rather than OpenCV, which cannot decode it before 4.10.
Intended first consumer: [`liria/dora-zed`](https://gitea.liria.cl/liria/dora-zed), whose `image_bgr` output already carries the `width`, `height` and `encoding` metadata this node expects.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Feature: OpenCV plot node for dora dataflows
User Story
As a developer debugging a dora vision pipeline,
I want a node that displays a video stream with bounding boxes and text drawn over it,
so that I can see what the pipeline is producing without writing frames to disk or adding a viewer to every node.
Requirements
imageevent.label, conf) and a text caption, both updated by their own inputs and drawn on the next redraw.bgr8,rgb8,jpeg/jpg/jpe/bmp/webp/png,yuv420,avif.xyxyandxywhbounding-box formats.PLOT_WIDTH/PLOT_HEIGHT.Acceptance Criteria
uv syncinstalls the node on aarch64 and x86_64 without apt packages or a compilerxywhboxes are converted toxyxycornersCI=truesuppresses the window while still decoding every inputdora validate dataflow.ymlpasses understrict_types: trueNotes
Based on
opencv-plotfrom dora-hub, brought up to the dora 1.0 node contract and packaged withuv.The node is deliberately Python rather than Rust. The
opencvRust crate generates its bindings from the OpenCV headers installed on the build machine, so it requireslibopencv-devandlibclang-devper machine and per architecture and does not cross-compile — which fails the multiarch requirement above.opencv-pythonships prebuilt wheels for every target instead, and AVIF support comes frompillow-avif-pluginrather than OpenCV, which cannot decode it before 4.10.Intended first consumer:
liria/dora-zed, whoseimage_bgroutput already carries thewidth,heightandencodingmetadata this node expects.