4 Commits

Author SHA1 Message Date
mikkeli 0f423fccd6 Add face detection to camera capture
- capture.py: detect faces with haar cascades (cv2.CascadeClassifier),
  draw green rectangles on frames before streaming
- capture/haarcascades/: bundled haar cascade XML
- README.md: document face detection feature and opencv dependency
2026-08-06 10:24:49 +09:00
mikkeli d4eebf79f6 Add MJPEG camera server with systemd deployment
- camera/capture.py: V4L2 mmap-based MJPEG frame capture with background thread
- camera/mjpeg.py: MJPEG streaming server (multipart/x-mixed-replace) + minimal web UI
- camera/app.py: Entry point with argument parsing and signal handling
- pyproject.toml: uv project config (no external dependencies)
- camera-webui.service: systemd unit for native Pi deployment
- README.md: Updated for systemd-only direction with install instructions
2026-08-06 01:17:26 +09:00
Mikkeli ceccdcc211 Document the USB webcam target, verified on the hardware
Its own repo rather than a source-selector inside camera-webui: a Codex agent is
already working in that repo on the Orin, and a second agent editing the same
files from another machine would collide for reasons unrelated to either one's
ability. Both projects exist to measure Codex + qwen3.6 on real hardware, and
two independent runs are readable where one repo full of merge conflicts is not.
Merging behind a switchable backend later is still a reasonable end state.

Hardware facts are measured, not assumed: a Logitech C505 (046d:08e3) on
/dev/video0 offering MJPG and YUYV, with a 1280x720 MJPG capture confirmed as a
genuine 33 KB JPEG by file(1) rather than by the write succeeding.

⚠ Records that /dev/video* is crowded on this board — video19 through video35
belong to the ISP and codec blocks with no camera attached, and video1 is the
webcam's metadata interface. Selecting a node by index is the obvious mistake
here, so AGENTS.md forbids it and names --list-devices and the USB ID instead.

Power is written in as a constraint rather than a footnote. The board runs on a
3 A supply with usb_max_current_enable=0, so the USB budget is the restricted
one. The C505 fits and the board is stable, but a second device may not, and the
post-mortem commands are recorded because this machine now keeps persistent
logs: a previous boot that ends in an orderly shutdown means something different
from one that stops mid-line.

AGENTS.md carries the rules earned elsewhere tonight: write files with
apply_patch and never write_stdin, stop after two identical failures instead of
incrementing an identifier, emit tool calls as JSON arguments, and read the
working tree with the shell because the gitea MCP tools see the server's copy
and cannot see anything uncommitted.
2026-08-06 00:44:19 +09:00
mikkeli 627f4be843 Initial commit 2026-08-05 15:43:04 +00:00