Webcam als Bewegungsmelder unter Ubuntu/Linux einsetzen
Bewegungsmelder sind relativ einfache Systeme, Schnittstellen für Computer sind jedoch relativ selten und teuer oder erfordern elektronische Ausrüstung. Mit einer einfachen Webcam geht es auch unter Linux.
Webcam einrichten
In der Ubuntu-Community-Hilfe steht, wie man eine Webcam grundsätzlich zum Laufen bekommt. Für meine Zwecke verwende ich eine Logitech QuickCam Messenger, die man als OEM-Ware bereits unter 25 EUR bekommen kann. Diese funktioniert unter neueren Ubuntu-Varianten allerdings nur unter dem Video4Linux-Kompatibilitätstreiber. Das ist jedoch keine größere Hürde…
Am besten liest man die Ubuntu-Community-Hilfe und testet cheese und andere Programme, ob die Kamera funktioniert.
Grundkonzept Bewegungsmelder
Die Grundidee ist folgende: Man kann die Webcam dazu nutzen, periodisch Standbilder zu schießen. Vergleicht man nun zwei Standbilder miteinander, kann man anhand der Unterschiede feststellen, ob eine Bewegung im Raum stattgefunden hat.
Dazu benötigen installieren wir zunächst ffmpeg:
sudo aptitude install ffmpeg
Ein Kurzer Test verrät, ob die Kamera funktioniert:
ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 -vframes 1 -vcodec mjpeg out.jpg
Falls es Fehler gibt, kann man auch folgendes ausführen:
LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so ffmpeg -f video4linux2 -s 320x240 -i /dev/video0 -vframes 1 -vcodec mjpeg out.jpg
Damit wird die besagte Kompatibilitätsbibliothek geladen. Es sollte sich eine schönes Videobild im Verzeichnis befinden, das den Namen out.jpg trägt.
Falls das geklappt hat, haben wir es fast schon geschafft!
Motiontrack installieren
Motiontrack ist eine Linux-Software, welche Bewegungen bzw. Unterschiede in Bildern errechnen kann. Leider ist die Software nicht als Ubuntu- oder Debian-Paket verfügbar und wir müssen es selbst bauen. Dafür installieren wir zunächst die wesentlichen Teile:
sudo aptitude install build-essential libgd2-xpm-dev wget checkinstall
(Anmerkung: wget und checkinstall müssen nicht zwingend installiert werden, wenn man das Paket anders holen und bauen will. libgd2-xpm-dev kann durch libmagick++-dev oder graphicsmagick-libmagick-dev-compat ersetzt werden, wenn man statt gd2 ImageMagick bzw. GraphicsMagick einsetzen will)
Dann holen wir uns Motiontrack und entpacken es:
wget gemia.de/motion/motiontrack-0.1.3.tar.gz
tar xzf motiontrack-0.1.3.tar.gz
cd motiontrack-0.1.3/
Nun können wir die Installation beginnen:
./configure
make
sudo checkinstall
Checkinstall ermöglicht das Erzeugen von Debian-Paketen aus einem build-Verzeichnis heraus. Wenn alles glatt läuft, sollte motiontrack installiert sein (ggf. mit which motiontrack prüfen, sollte in /usr/local/bin/motiontrack sein).
Bewegungsmelder basteln
Ein kleines Skript verdeutlicht nun die Funktionsweise des Bewegungsmelders:
#!/bin/bash
# motiontracker.sh
# Convert a webcam to a simple motion tracker
# (c) 2009 Max Kalus
#Only if v4l2 does not work properly
export LD_PRELOAD=/usr/lib/libv4l/v4l1compat.so
while [ 1 ]; do
echo "Mark: $(date)"
ffmpeg -f video4linux2 -s qvga \
-b 9216 -r 10 -i /dev/video0 \
-vframes 1 -vcodec mjpeg /tmp/pic2.jpg 2>/dev/null
MOTION=$(motiontrack /tmp/pic1.jpg /tmp/pic2.jpg \
--sensitivity=9 2>/dev/null | head -n 1)
echo "Motion: $MOTION"
mv /tmp/pic2.jpg /tmp/pic1.jpg
#sleep 5
done
Dieses Skript können Sie kopieren, als motiontracker.sh speichern und per chmod +x motiontracker.sh ausführbar machen. Gegebenenfalls müssen noch Einstellungen an ffmpeg und motiontrack vorgenommen werden, um alles richtig laufen zu lassen.
Was macht das Skript? Es wird eine Endlosschleife erzeugt (die mit Strg+C unterbrochen werden kann), in der zuerst das aktuelle Datum ausgegeben wird. Dann wird ffmpeg aufgerufen und ein Bild von der Kamera geholt. Dieses wird unter /tmp/pic2.jpg gespeichert. Nach dem Vergleich wird dieses Bild nach /tmp/pic1.jpg verschoben werden. Zunächst aber vergleicht Motiontrack die beiden Bilder (falls sie existieren). Per head -n 1 wird lediglich die Anzahl der Unterschiede ausgegeben.
Die Ausgabe des Skripts, aufgerufen per ./motiontracker.sh sollte etwas in der Art ausgeben:
“Motion: 25”
“Mark: Fr 4. Sep 13:42:57 CEST 2009”
“Motion: 27”
“Mark: Fr 4. Sep 13:42:59 CEST 2009”
“Motion: 184”
“Mark: Fr 4. Sep 13:43:01 CEST 2009”
“Motion: 137”
“Mark: Fr 4. Sep 13:43:03 CEST 2009”
“Motion: 150”
“Mark: Fr 4. Sep 13:43:05 CEST 2009”
“Motion: 33”
Zuerst wird das aktuelle Datum angezeigt, dann die Bewegungsskala. Deutlich sichtbar ist hier, dass bei Bewegungen der Wert deutlich über 100 ansteigt, bei fehlender Bewegung dümpelt er deutlich unter 100 herum. Mein Rechner braucht übrigens eine Weile zum extrahieren der Bilder per ffmpeg. Falls das Abfragen zu schnell gehen sollte, kann man den auskommentierten sleep-Befehl unten im Skript verwenden, um das Skript etwas auszubremsen.
Dieses Skript ist lediglich ein kleiner Test, zeigt aber die Möglichkeiten von Webcam, ffmpeg und motiontrack. Will man nun automatisierte Reaktionen des Skripts erzeugen, sind einige Dinge denkbar:
- Per
netcatkönnte die Anzahl der Bewegungsvektor an einen entfernten Rechner oder eine Anwendung geschickt werden, die an einem Socket lauscht. Dazu müsste man unter dem zweiten echo bswp.echo $MOTION | netcat -u 192.168.0.99 2000eingeben, um ein UDP-Paket mit dem Vektor zu verschicken. - Man könnte das 2. Bild auch per Mail verschicken, um zu z.B. sehen, ob die Katze wieder einmal auf dem Drucker schläft:
"echo "Katze auf Drucker!" | mailx -s 'Katze auf Drucker!' meine@mail.de -a /tmp/pic2.jpg".
Nun ja, einige kleine Ideen…
P.S.: Ein anderes, interessantes Projekt ist möglichweise Motion, welches offenbar die obigen Prozesse in einem Paket zusammenfasst und noch viel, viel mehr kann.
- 11 Kommentare
Interessanter Artikel!
Interessanter Artikel! Danke für die ausführliche Infos, die sind wirklich sehr nützlich und wichtig für mich! Super Beitrag! Danke! ;-)
Danke!
Danke für das Lob – es freut mich, wenn ich damit Anregungen geben konnte.
Max.
Danke!
Danke sehr für Deine ausführliche Beschreibung.
emmerich
Neue Beiträge?
Wann kann wieder mit neuen Beiträgen gerechnet werden?
Re: Neue Beiträge?
Nun, Beiträge kommen unregelmäßig ;-) Wenn ich Zeit und Ideen habe, dann werde ich wieder neue Artikel schreiben.
Hallo
Hallo,
vielen Dank für die Infos. Hab genau sowas gesucht. Und es funktioniert tatsächlich :-D
Fehler bei Scriptausführung ???
Hallo Leutz,
Wenn ich das Script ausführe unter Ubuntu Server 10.
Erhalte ich folgenden Fehlertext... Ich werde nicht Schlau daraus.
Könnte es an den Berechtigungen liegen?
ERROR: ld.so: object '/usr/lib/libv4l/v4l1compat.so' from LD_PRELOAD cannot be preloaded: ignored.
ERROR: ld.so: object '/usr/lib/libv4l/v4l1compat.so' from LD_PRELOAD cannot be preloaded: ignored.
Mark: Don Jun 17 06:05:53 CEST 2010
Danke im Voraus für jegliche Hilfe.
MfG Nemotilz
Re: Fehler bei Scriptausführung ???
Nun, ohne weitere Informationen kann ich wenig sagen. Existiert die Datei, kannst du sie lesen?
Ansonsten kannst du mit Hilfe von "file /usr/lib/libv4l/v4l1compat.so", "ldd /usr/lib/libv4l/v4l1compat.so" die Grunddaten der Datei abfragen und schauen, ob z.B. bestimmte abhängige Libraries noch fehlen.
Die Bibliothek kannst du mit Hilfe von $LD_DEBUG zu genaueren Fehlermeldungen bewegen (genaueres bei Google und mit Hilfe von "man ld.so").
Max.
kleiner Fehler?
Hey,
meinst du vllt "./configure" statt "configure"? So war es zumindest bei mir ^^
Sonst echt toller Post. Dankeschön dafür!
Grüße!
Re: kleiner Fehler?
Stimmt - bessere ich aus!
Danke!
Merci, genau das hab ich gesucht! Dank der guten Anleitung hat auf Anhieb auch alles gleich funktioniert.