Technik
Als Webcam kommt ein TP-Link Tapo C320WS1 zum Einsatz. Die Bilder werden auf einen Raspberry Pi per RTSP ausgelesen und mit FFMPEG2 verarbeitet. Mit ImageMagick3 erfolgt dann noch eine Nachbearbeitung, bevor die bearbeiteten Bilder per rsync4 auf den Server geladen werden.
Die Entscheidung für die Tapo-Kamera viel, da ich bereits eine andere Kamera des Herstellers im Einsatz habe. Die Kamera kann ohne Cloud-Dienst betrieben werden und durch den RTSP-Stream ist eine Verwendung des Bildmaterials für eigene Zwecke ohne größeren Aufwand möglich.
Bash-Skript zu Verarbeitung
Die Bildbearbeitung erfolgt direkt unter Linux mit einem Bash-Skript.
#!/bin/bash
webcam=<WebCamm IP>
user=<WebCam Benutzer>
password=<passwort>
picture=/tmp/webcam$RANDOM.jpg
wc_pfad=/opt/webcam
rsync_user=<rsync Benutzer>
rsync_host=<rsync Host>
rsync_dir=<remote rsync-Pfad>
# aktuelle Stunde ermitteln
hour=$(date +%H)
if [ hour == 00 ];
then
hour=24
fi
$(whereis bin | ffmpeg -y -i rtsp://$user:$password@$webcam:554/stream1 -vframes 1 -loglevel quiet $picture)
# Bildatei vorhanden
if [ -f $picture ];
then
# aktuelles Bild
mv $picture $wc_pfad/images/latest.jpg
# Archivbild
if [ ! -f $wc_pfad/images/archiv/$hour.jpg ] || [ $(($(date +%s) - $(date -r $wc_pfad/images/archiv/$hour.jpg +%s))) -gt 3600 ];
then
cp $wc_pfad/images/latest.jpg $wc_pfad/images/archiv/$hour.jpg
fi
# Sync auf Server
rsync -avzz --delete $wc_pfad/images/ ${rsync_user}@${rsync_host}:~/${rsync_dir} > /dev/null
fi
Das Zielverzeichnis (wc_pfad) ist das Verzeichnis, in dem die Bilder abgelegt werden und welches dann auf den Webserver synchronisiert wird. In diesem Verzeichnis gibt es weiterhin noch ein Verzeichnis archiv für das 24-Stunden-Archiv.
Ich lasse das Skript per Cron alle fünf Minuten laufen. Das Archiv wird einmal pro Stunde mit einem Bild befüllt und das laufende Bild alle fünf Minuten.
Bereiche unkenntlich machen
Möchte man weiterhin noch Bereiche (z.B. aus Datenschutzgründen) auspixeln, so kann man hierfür ImageMagick verwenden. Vor dem Verschieben des aktuellen Bildes können ein oder mehrere Befehlszeilen der Folgeden Art eingefügt werden:
$(whereis bin | convert $picture \( -clone 0 -fill white -colorize 100 -fill black -draw "polygon x1,y1 x2,y2 x3,y3 x4,y4 x5,x5" -alpha off -write mpr:mask +delete \) -mask mpr:mask -blur 200,100 +mask $picture_neu.jpg)
mv $picture_neu.jpg $picture
Die Werte x,y-Paare müssen hier mit den entsprechenden X- und Y-Koordinaten im Bild ausgetauscht werden.
Kamera - Tapo C320WS
Bei der Kamera handelt es sich um eine an sich relativ günstige, aber solide WLAN Sicherheitskamera für den Außenbereich. Sie ist ohne einer Cloud verwendbar (außer bei der Konfiguration) und durch die Erfüllung des IP66-Standards machen auch Witterungseinflüsse nichts aus. Allerdings betrifft das nur die Kamera. Das Netzteil ist ein Innenraumnetzteil und muss entsprechend Betrieben werden! Da sollte TP-Link nachbessern.
Die Sicherheitsfunktionen sind für mich in diesem Fall uninteressant. Ich benötige keine Bewegungserkennung etc. Dass diese aber funktionieren, davon gehe ich aus. Erfahrungen damit konnte ich bereits mit anderen Tapo-Kameras machen, die ich verwende. Die Entscheidung für diese Kamera fiel ja auch, dass diese in die bestehende Infrastruktur passt.
Interessant ist hingegen der Zugriff per RTSP und das verwendete Videoformat MPEG4. Damit bestehen vielfältige Möglichkeiten der individuellen Weiterverarbeitung.
Dächer sichtbar?
Eine Frage die bereits aufkam ist, warum die Dächer sichtbar sind und nicht ebenfalls unkenntlich gemacht wurden. Der Hintergrund ist einfach: Dächer sind ein guter Indikator, ob es gereift hat oder Frost gab. Es handelt sich also um einen guten Hinweis, wie das Wetter ist, ohne das ich hierbei in die Privatsphäre eingreifen muss.