Bewegungserkennung pro Kamera (Pillow), Bewegungsbilder in der Timelapse-Galerie mit Filter
This commit is contained in:
1 parent
420e8e1550
commit
ff3dc7ee2b
4 files changed
+125
-32
No files matched your search
@@ -31,6 +31,7 @@ Zwei kleine Python-Tools für MJPEG-Kameras:
|
||||
|
||||
- Python 3
|
||||
- [`requests`](https://pypi.org/project/requests/)
|
||||
- Optional: [`Pillow`](https://pypi.org/project/pillow/) für die Bewegungserkennung (`apt install python3-pil` oder `pip install pillow`)
|
||||
- Optional: `ffmpeg` für den Video-Download der Timelapse als MP4 (`apt install ffmpeg`); ohne ffmpeg liefert das Relay ein MJPEG-AVI
|
||||
- Optional für `webcam.py --show`: `opencv-python` und `numpy`
|
||||
|
||||
@@ -55,6 +56,7 @@ cp .env.example .env
|
||||
| `SETUP_<name>` | Optional: Konfigurations-URL der Kamera (z. B. `http://IP/control?var=framesize&val=11`). Das Relay ruft sie auf, wenn im Frontend „Setup“ geklickt wird. | – |
|
||||
| `TIMELAPSE_INTERVAL` | Optional: Standard-Intervall der Timelapse in Sekunden. Ein/aus und Intervall werden je Kamera im Frontend gesetzt und in `state.json` gespeichert. | `300` |
|
||||
| `TIMELAPSE_DIR` | Zielordner, Struktur `<name>/<JJJJ-MM-TT>/<HHMMSS>.jpg`. | `timelapse/` neben `relay.py` |
|
||||
| `MOTION_COOLDOWN` | Mindestabstand in Sekunden zwischen zwei Bewegungsbildern (Erkennung selbst je Kamera im Frontend, braucht Pillow). | `10` |
|
||||
| `TIMELAPSE_KEEP_DAYS` | Tage aufbewahren, ältere Tagesordner werden gelöscht (0 = unbegrenzt). | `0` |
|
||||
| `PORT` | Port, auf dem der Relay lauscht | `8000` |
|
||||
| `AUTH_USER` / `AUTH_PASS` | Optional: Basic-Auth. Nur sinnvoll mit HTTPS (z. B. in Zoraxy). | aus |
|
||||
@@ -109,10 +111,10 @@ journalctl -u webcam-relay -f
|
||||
| `/status.json` | Online-Status aller Kameras (wird vom Frontend alle 5 s abgefragt) |
|
||||
| `/<name>/stream.mjpg` | Livestream (`multipart/x-mixed-replace`) |
|
||||
| `/<name>/snapshot.jpg` | Aktuelles Einzelbild |
|
||||
| `POST /<name>/timelapse` | Timelapse steuern, Body `{"enabled":true,"interval":300}` |
|
||||
| `POST /<name>/timelapse` | Timelapse und Bewegungserkennung steuern, Body z. B. `{"enabled":true,"interval":300,"motion":true,"sensitivity":"mid"}` |
|
||||
| `/<name>/timelapse.json` | Gespeicherte Timelapse-Bilder je Tag |
|
||||
| `/<name>/timelapse/<tag>/<datei>.jpg` | Einzelnes Timelapse-Bild |
|
||||
| `/<name>/timelapse/<tag>/video?fps=10` | Tagesvideo als Download (MP4 mit ffmpeg, sonst MJPEG-AVI); `fps` 1–60 |
|
||||
| `/<name>/timelapse/<tag>/video?fps=10` | Tagesvideo als Download (MP4 mit ffmpeg, sonst MJPEG-AVI); `fps` 1–60, mit `&kind=motion` aus den Bewegungsbildern |
|
||||
| `/stream.mjpg`, `/snapshot.jpg` | Alias für die erste Kamera (Abwärtskompatibilität) |
|
||||
| `/health` | Status aller Kameras (`200` wenn alle liefern, sonst `503`); ohne Authentifizierung erreichbar |
|
||||
|
||||
@@ -122,7 +124,7 @@ Das Frontend liegt in `frontend.html` (reines HTML/CSS/JS, keine Abhängigkeiten
|
||||
|
||||
- Dunkles Design, zwei Kameras nebeneinander (auf dem Handy untereinander); Klick auf den Namen öffnet die große Ansicht
|
||||
- Statuspunkt und Hinweis „Kamera offline“ pro Kamera, automatisches Neuverbinden, Zähler „X / Y online“
|
||||
- Buttons pro Kamera: Start, Stop, Reload, Foto (Download), Vollbild; „Timelapse“ schaltet die Aufnahme je Kamera ein/aus, „Galerie“ zeigt die Bilder (Tag wählen, anklicken, abspielen; Intervall einstellbar) und lädt ein Tagesvideo herunter (5/10/25 fps)
|
||||
- Buttons pro Kamera: Start, Stop, Reload, Foto (Download), Vollbild; „Timelapse“ schaltet die Aufnahme je Kamera ein/aus, „Galerie“ zeigt die Bilder (Tag wählen, anklicken, abspielen; Intervall einstellbar) und lädt ein Tagesvideo herunter (5/10/25 fps); „Bewegung“ schaltet die Bewegungserkennung je Kamera ein/aus – Bewegungsbilder (orange markiert) erscheinen in derselben Galerie und lassen sich filtern
|
||||
- Toolbar: Alle starten / stoppen / neu laden
|
||||
- „Setup“ pro Kamera und „Setup alle“, sofern `SETUP_<name>` konfiguriert ist; das Relay ruft die URL auf, der Browser muss die Kamera nicht erreichen
|
||||
- Streams werden getrennt, solange der Tab im Hintergrund ist
|
||||
@@ -134,6 +136,7 @@ Das Frontend liegt in `frontend.html` (reines HTML/CSS/JS, keine Abhängigkeiten
|
||||
- Bei Verbindungsfehlern wird nach 3 Sekunden automatisch neu verbunden.
|
||||
- Alle Zuschauer bekommen jeweils das neueste Frame – die Kamera wird unabhängig von der Zuschauerzahl nur einmal belastet.
|
||||
- Der Header `X-Accel-Buffering: no` verhindert Pufferung durch den Proxy.
|
||||
- Bewegungserkennung: Jede Sekunde wird das Frame auf 80×60 Graustufen verkleinert und mit einem langsam nachgeführten Referenzbild verglichen. Ändern sich mehr als 4 % / 2 % / 0,7 % der Pixel (Empfindlichkeit niedrig / mittel / hoch), wird das Bild als `HHMMSS_m.jpg` neben den Timelapse-Bildern gespeichert (danach `MOTION_COOLDOWN` Sekunden Pause). Das Nachführen des Referenzbilds fängt Tageslichtwechsel ab.
|
||||
|
||||
## Stream-Tool (`webcam.py`)
|
||||
|
||||
|
||||
Reference in new issue
Block a user