HomeAssistant, Unifi AI 360, Dewarp
Bis vor kurzem hatten wir eine 08/15 Kamera bei uns im Einsatz, welche einfach auf die Tür gerichtet war. Beim Drücken der Klingel hat diese ein Foto gemacht, und uns das per Telegram zugesendet.
Diese Kamera habe ich mit meinem Umstieg auf Unifi ausgetauscht; nun hängt dort eine AI 360 Kamera. Das tolle an dieser ist, dass die über eine Fisheye-Linse die gesamte Auffahrt aufnimmt; das blöde an dieser ist, dass sie über eine Fisheye-Linse die gesamte Auffahrt aufnimmt. Video-Footage von der Kamera lässt sich in diesem YouTube-Video von einem anderen Menschen einsehen; und genau dieses Footage lässt sich auch nur unverändert via RTSP abgreifen. Praktisch, für den Überblick, allerdings unpraktisch, um genau nur den Eingang der Tür zu sehen zu bekommen. Zusätzlich: die Tür befindet sich bei mir allerdings eher am Rand des Fisheye-Bildes; etwas vernünftig zu erkennen ist also relativ schwierig, erfordert reinzoomen in das Bild und drehen des Smartphones, damit man raten kann, wer einen da aus der Mittagsruhe reißt.
Die hier genannten Befehle dürften in der Theorie auch mit Videos funktionieren; habe ich allerdings nicht getestet, war meinerseits kein Bedarf dran
Die ersten Anläufe brachten mich am schnellsten mit ffmpeg voran. Nach ein bisschen rumgespiele habe ich es hinbekommen, einen Screenshot aus dem Stream mit folgendem Befehl den richtigen Bereich entzerrt hinzubekommen:
ffmpeg -i input.jpg -vf "v360=fisheye:flat:yaw=80:roll=90" -y output.jpg
Mit „yaw“ habe ich dabei die Kamera ca. 80 Grad nach rechts bewegt, mit „roll=90“ das Bild anschließend um 90 Grad im Uhrzeigersinn gedreht. Es gibt noch „pitch“, falls jemand die dritte Dimension vorne/hinten benötigt – in meinem Fall war die Tür allerdings auf Höhe der Kamera.
Das resultierende Bild zeigt nun zwar die Tür, allerdings mit einem großen schwarzen Balken drum herum. Nach viel rumexperimentieren bekam ich mit ffmpeg und folgendem Filter alles unrelevante drum herum abgeschnitten:
ffmpeg -i output.jpg -vf "crop=in_w:in_h/1.6:in_w:in_h/1.6" -y output2.jpg
Der Befehl schneidet ca 40% (genauer: 37,5%) des Bildes oben weg. Also alles, was komische Verzerrung ist.
Beide Befehle lassen sich nun zu einem kombinieren:
ffmpeg -i input.jpg -vf "v360=fisheye:flat:yaw=80:roll=90, crop=in_w:in_h/1.6:in_w:in_h/1.6" -y output.jpg
Und schon können wir unseren Zielbereich mittels ffmpeg aus der AI 360 umwandeln.
Um Home Assistant nun beizubringen, dass es die Bilder umwandeln soll, fügen wir unserer configuration.yaml
folgende Zeilen hinzu:
ffmpeg:
shell_command:
convert_driveway_image: "ffmpeg -i /config/www/camera/driveway.jpg -vf \"v360=fisheye:flat:yaw=80:roll=90, crop=in_w:in_h/1.6:in_w:in_h/1.6\" -y /config/www/camera/driveway-dewarped.jpg"
Wir haben nun den Dienst shell_command.convert_driveway_image
, welcher bei Ausführung die /config/www/camera/driveway.jpg
dewarpt und als /config/www/camera/driveway-dewarped.jpg
abspeichert.
In einer Automation lässt sich das wie folgt hinterlegen:
alias: Kamera - bei Klingeln Foto senden
description: ""
trigger:
- platform: state
entity_id: binary_sensor.turklingel_button_gpio_5
from: "off"
to: "on"
condition: []
action:
# Schritt 1: Screenshot von der Kamera in driveway.jpg speichern
- service: camera.snapshot
data:
filename: /config/www/camera/driveway.jpg
target:
entity_id: camera.camera_ai_360_high
# Schritt 2: das Bild umwandeln, indem wir den ffmpeg-Befehl ausführen
- service: shell_command.convert_driveway_image
data: {}
# Schritt 3: Das dewarpte Bild versenden
- service: notify.telegram_group
data_template:
message: Klingeln an der Tür
data:
photo:
file: /config/www/camera/driveway-dewarped.jpg
caption: "Klingeln an der Tür - #Klingel"
Tada, doch viel einfacher als gedacht.
Bonus-Inhalt falls jemand an den Parametern verzweifelt: um die richtigen zu finden, habe ich nur mit diesen rumgespielt. Ich habe nicht mal eine Ahnung, ob das Zufall ist oder nicht, dass es so klappt.
Zuerst hatte ich mir ffmpeg für Windows heruntergeladen, einen Screenshot als input.jpg in das bin-Verzeichnis gepackt, dann auf Basis von diesem Befehl die Parameter verändert:
.\ffmpeg.exe -i input.jpg -vf "v360=fisheye:flat:pitch=0:yaw=0:roll=0" -y output.jpg
Das Bild habe ich nach jedem Rumspielen an pitch, yaw und roll geöffnet. Mit pitch bewegt man sich in dem Bild nach oben und unten; mit yaw nach links und rechts. Da in meinem Fall das Bild in top-down aufgenommen wurde, bedeutet nach rechts bewegen dann auch, dass das Bild auf der Seite steht und nach unten, dass es auf dem Kopf steht. Da kommt roll ins Spiel; setzen wir das auf 90, drehen wir das Bild um 90 Grad im Uhrzeigersinn, und es zeigt in die richtige Richtung.