Dreambox als Babyfon/Überwachung

  • Hi,


    ideal wäre natuerlich eine Webcam mit eingebauter motion detection. Dann bräuchte nur ein Script ein paar Bilder zu sammeln und schon könnte man die ausgeben lassen. Ideal. Mehr bräuchte man nicht, um die Basis Funktion darzustellen.


    Die billigen Webcams können das natuerlich nicht. Ergo muss die Auswertung auf der Dream passieren. Bin gerade auf der Suche nach einem einfachen tool, das 2 jpgs miteinander vergleicht und den "Unterschieds-Grad" ausgibt.


    Weitere Schritte?


    LazyT, rückst du deinen Source Code raus?


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

  • Zitat

    LazyT, rückst du deinen Source Code raus?


    Müsste ich wohl, sonst dürfte es etwas schwierig für euch werden das an eure Bedürfnisse anzupassen. Ist eigentlich nix besonderes drin, nur schnell zusammen geschustert. :winking_face:


    Wird aber erst Mo was, wenn ich wieder Heim bin...

    Ich bin nicht faul sondern im Energiesparmodus!

  • Alles klar, LazyT. Bis dahin koennen wir locker warten. Meine Frau ist jetzt schon von den Socken ... blende ihr hin und wieder mal unseren Nachwuchs ins laufenden TV Bild ein.


    :winking_face:


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

  • Hallo Miteinander,


    kurzer Zwischenstand zur "motion detection":


    Im Jasper Package (h**p://www.ece.uvic.ca/~mdadams/jasper/) ist ein Tool namens "imgcmp" enthalten. Es vergleicht 2 Bilder nach vordefinierten Methoden und gibt das Ergebnis als float aus.


    master:~/motion# imgcmp
    Image Comparison Utility (Version 1.701.0).
    Copyright (c) 2001 Michael David Adams.
    All rights reserved.
    usage:
    imgcmp -f reference_image_file -F other_image_file [-m metric]
    The metric argument may assume one of the following values:
    psnr .... peak signal to noise ratio
    mse ..... mean squared error
    rmse .... root mean squared error
    pae ..... peak absolute error
    mae ..... mean absolute error
    equal ... equality (boolean)


    Mit diesem script (Achtung: keine Optimierung gemacht!) lade ich das Standbild von der Kamera, konvertiere die JPGs in das pnm Format (portable bitmap) und vergleiche es mit dem vorherigen.


    --------script ipcam-wget--------------------------------------
    while true
    do
    wget -q http://root:admin@192.168.xxx.xxx/still.jpg -O baby.jpg
    djpeg -pnm baby.jpg >baby.pnm
    rm baby.jpg
    imgcmp -f baby.pnm -F baby1.pnm -m mse
    cp baby.pnm baby1.pnm
    #sleep 2
    echo "-----"
    done
    --------------------------------------------------------------


    Die Ausgabe ohne Bewegung vor der Kamera (zw. ---- jeweils eine voll Schleife):
    --------------------------------------------------------------
    master:~/motion# ./ipcam-wget
    9.454759
    5.508607
    15.278851
    -----
    8.643014
    5.064655
    15.172617
    -----
    8.307373
    4.599561
    14.637210
    -----
    9.623802
    6.056257
    15.317741
    -----
    --------------------------------------------------------------


    Ausgabe, wenn ich langsam mit der Hand in 1m Abstand vor der Kamera winke:
    --------------------------------------------------------------
    master:~/motion# ./ipcam-wget
    349.764922
    446.020905
    506.253141
    -----
    330.762920
    381.252725
    477.829606
    -----
    249.273945
    267.962005
    323.760902
    -----
    402.104880
    450.979124
    561.318792
    -----
    264.999746
    312.692487
    414.525986
    -----
    ----------------------------------------------------------------


    Soweit zum Stand. Schon mal brauchbar, denke ich.


    Gruß Mamba


    PS: Wer das djpeg tool noch nicht auf seiner Linux Maschine hat:
    h**p://www.ijg.org/

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

    Einmal editiert, zuletzt von mamba0815 ()

  • Hi,


    das es thematisch hier hin passt:


    ICMP (ähnlich dem Jasper IMGCMP) auf Dreambox portiert: hier


    War kein Akt. Piece of cake.


    Damit ist die Bewegungserkennung direkt auf der Dreambox möglich. Mehr dazu in Kürze.


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

    3 Mal editiert, zuletzt von mamba0815 ()

  • mamba,


    coole Sache, das imgcmp. Aber sag mal ich hab mir mal das pdf von der Homepage angeschaut, das Tool müsste doch die jpgs direkt miteinander vergleichen können, warum wandelst du sie erst ins *.pnm-Format? Ich weiß, das Beispiel dort ist mit dem Format aufgeführt, aber haste es mal mit jpg direkt probiert? Spart Rechenleistung...
    Noch ein Vorschlag: Lad nur am Anfang und dann eventuell alle 30 sek. ein einziges Bild von der Cam in den tmp-Speicher der Dream und nimm immer dieses Bild zum Vergleich mit all den folgenden Bildern. Vielleicht verträgt das imgcmp sogar direkt den http://root:admin@192.168.xxx.xxx/still.jpg-Link als zu vergleichendes Bild ( mit oder ohne wget - ich glaubs zwar nicht, aber Versuch macht klug)
    Anders herum muss man aber auch sagen, daß ein Vergleich wie in deinem Falle alle 2 oder bis 5 sek. eh die Rechenleistung nicht so übermäßig belasten wird. Ist ein echt Klasse Ansatz zum Erkennen von Bewegungen auf dem Bild. Anhand des Zahlenwertes (Sollte wohl zum Schluss ein Eintrag in einer Config sein) wird man dann wohl das Bild auf den Fernseher bringen können - prima Idee...


    LazyT sag mal haste eine Idee, wie man ein jpeg durch Dauernachladen als einigermaßen Flimmerfreien Film auf den Monitor bekommt?


    Das Bild stammt übrigens von meiner Cam, die ist im Baldarin des Babybettes mit Blick nach unten befestigt. Dieses Bild ist ein Infrarot-Bild, welches genau so auch im Tuxwetter als Vollbild auf den Fernseher kommt. Für die Babycam-Anwendung dürfte daher auch eine Schwarz-Weiß-Ausgabe (Falls es Probleme der Rechenleistung geben sollte) zugunsten einer flüssigen Wiedergabe als Film ausreichend sein.
    Für einen eventuellen Einsatz als Türwächter wäre wohl eher eine Farbausgabe zu bevorzugen - da auch Tagaufnahmen stattfinden, aber ich glaub da sind wir lange noch nicht...

    DM7000 - 80GB-HDD - 1GB-USB-Stick - 100Mbit-LAN
    DM600 - 20GB-HDD - 100Mbit-LAN

    2 Mal editiert, zuletzt von card0384 ()

  • Hallo Miteinander, hi card,


    wir kommen der Sache näher. Es tut. Die Dreambox erkennt eine Bewegung und zeigt dann mit LazyTs webcam binary das auslösende Bild auf dem TV Screen an (derzeit noch festverdrahtet für 5 Sekunden).


    :]


    Hinweis: Es handelt sich hier um meinen ersten (BETA BETA BETA!!!) und vollkommen unsauberen Versuch. Das Ding ist noch warm und daher sind weder Optimierungen noch "fail safe" Netze eingezogen worden. Beispiel: wenn die IPCAM nicht erreichbar ist, steht das script. Die Nutzung der log files und Variablen ist auch noch weit vom Optimum entfernt. Also keine bitte "flames". :grinning_squinting_face:



    Der angehaengte File sollte in /tmp ausgepackt werden (Achtung: nicht in den Flash!). Dann entsteht ein Verzeichnis namens "motion". Darin liegt ein script mit dem gleichen Namen. Das sollte man in einer shell mit "./motion" starten. Zuvor noch die IP Adresse der eigenen IPCAM anpassen und auch die Zugangsdaten (user-id, password).


    Es folgen shell Ausgaben eines int Wertes(z.B. 'icmp: 1'), der für die Gleichheit der letzen beiden empfangenen Bilder steht. Kleiner heißt gleicher. Ab dem Schwellwert "threshold" (derzeit fest auf '6' gesetzt) erkennt die if Abfrage eine Bewegung und löst die Ausgabe auf dem TV Screen aus.


    Der icmp-Algorithmus ist relativ langsam. Daher lasse ich die auszuwertende Bilder von djpeg auf 1/4 der Originalgröße verkleinern. Leider versteht icmp kein jpg, daher muessen die Bilder vor der Verarbeitung nach BMP konvertiert werden. Damit schafft 'motion' ca. 4 Durchläufe / Sekunde. Auf dem P3 1 Ghz sind es ca. 10. Hier ist dann wohl die IPCAM der Flaschenhals. Schneller kommen wohl die Bilder per wget nicht auf die Linuxmaschine. Naja ... mal sehen, was man da noch machen kann.


    Ich bin schon weiter am Optimieren, d.h. ich wäre über Ideen/Anregungen zur Verbesserung sehr interessiert. Logischerweise wird eine variable Einstellung der ipcam-ipaddr, etc noch folgen.


    Gruß Mamba
    _________________________
    Update: 18.09.2006, 18 Uhr


    So langsam gewinnt 'motion' an Kontour.


    motion-0.1.tar.gz.


    Was wurde verbessert?
    1. stdout: heartbeat, icmp wert, icmp max wert, anzahl erkannter bewegungen
    2. alle zur laufzeit erzeugt files werden unter /tmp abgelegt
    3. vorbereitung für serielle ausgabe der letzten x bilder bei bewegungsalarm
    4. settings in variablen abgelegt. man muss nur die punkte 1-4 (sieh file) anpassen/prüfen
    5. erkennungsqualität stark verbessert, keine doppelalarme mehr
    6. geschwindigkeit stark verbessert, teilweise wieder aufgefressen durch statistikfunktionen, etc.


    Was soll noch kommen?
    1. steuerung der settings ueber shell parameter
    2. webcam sollte bilder auch ohne wartezeit ausgeben (t=0)
    3. alles, was euch noch einfällt


    Gruß Mamba

  • Hi jenscz,


    woher kriege ich den compiler für die 7025? Habe hier nur den ppc-compiler. Werde mich mal auf die Suche machen. Man muss nur djpeg, icmp und das webcam tool von LazyT kompilieren. Sollte kein Akt sein.


    Habe oben ein Update ge-up-t: motion-01.tar.gz


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

  • Zitat

    sag mal haste eine Idee, wie man ein jpeg durch Dauernachladen als einigermaßen Flimmerfreien Film auf den Monitor bekommt?


    Eins nach dem anderen, soweit sind wir noch lange nicht. :winking_face:


    Zitat

    Wenn das Ganze dann noch für die 7025 kompiliert werden kann bzw auch wird ist es der Hammer!


    Dachte da gibt's schon ein WebCam-Plugin?


    @mamba0815/card0384


    Da ich keine Cam habe könnte mal jemand 2-3 Bilder ohne Bewegung und 2-3 mit hochladen? Ich würde gerne mal versuchen, dass webcam das intern selber checkt und wir keine externen Tools/Scripte benötigen. Das still.jpg sollte es auch schon selber laden.


    Ich halte daher den Source mal noch zurück bis ich das alles gecheckt habe...

    Ich bin nicht faul sondern im Energiesparmodus!

  • Zitat

    Original von mamba0815
    Ich bin schon weiter am Optimieren, d.h. ich wäre über Ideen/Anregungen zur Verbesserung sehr interessiert.


    Hi Mamba, ich hab doch schon einiges in meinen Beiträgen in dem Tread geschrieben - mehr fällt mir dazu auch erstmal nicht ein - bis dahin ists eh noch ein ganzes Stück Arbeit.


    Wenn LazyT in seinem Script das wget gleich einbaut, dann ist es wohl auch einfacher dein motion auch gleich mit einzubauen, denn motion steht ja zwischen wget und Ausgabe auf Fernseher...


    Wenn das Laden der Bilder und Vergleichen der Veränderungen klappt, wäre der nächste Schritt das PiP mit Option per Taste zum Großbild.
    Mamba, vielleicht kannste jetzt schon eine Taste belegen, beim Drücken wird das Bild auch sofort schon angezeigt ( LazyT - später als Film - aber soweit sind wir ja noch nicht :grinning_squinting_face: )


    Eins fällt mir doch noch ein - versuch mal dein Script dahinein zu optimieren, daß er erst bei sagen wir mal 3-5 sekunden hintereinander Veränderungen das Bild bringt - damit unterdrücken wir z.B. ein einfaches Drehen des Kindes o.ä.

    DM7000 - 80GB-HDD - 1GB-USB-Stick - 100Mbit-LAN
    DM600 - 20GB-HDD - 100Mbit-LAN

    2 Mal editiert, zuletzt von card0384 ()

  • Zitat

    Da ich keine Cam habe könnte mal jemand 2-3 Bilder ohne Bewegung und 2-3 mit hochladen?


    Motiondetection ist nun drin, nur testen kann ich's ohne Bilder eben nicht. Also, wie schaut's denn nun damit aus?

    Ich bin nicht faul sondern im Energiesparmodus!

  • Anbei 5 bilder zuerst 4x ohne Bewegung (motion 0..3.jpg) und dann das Bild, das einen Alarm auslöst (motion6.jpg). Ist die Hand meiner Frau, die vor dem Bild "vorbeihuscht".


    Du siehst, der WAF ist bei dieser Entwicklung relativ hoch!!!
    :winking_face:


    Gruß Mamba

  • So, dann testet mal bitte:


    Code
    webcam <image> <scaler> <color> <threshold> <delay>

    webcam kommt jetzt nicht mehr zurück sondern läuft in einer Endlosschleife und testet auf Bewegung im angegebenen Bild.


    Bei Bewegung wird dieses nun ohne Pause ausgegeben. Sobald keine Bewegung mehr erkannt wird bleibt das letzte Bild noch für die übergebene Zeit stehen und wird dann ausgeblendet. Im Abstand von 1s wird nun auf die nächste Bewegung gewartet und das Spiel beginnt von vorn. Welche Schwellwerte sinnvoll sind kann ich nicht beurteilen, müsst ihr probieren.


    Soweit zur Theorie, Praxis nun bei euch. :grinning_squinting_face:

  • Hi,


    ok. Funktioniert. Aber es gibt ein bug: Da webcam_02 den jpg file nicht selbst per wget holt, muessen wir das Lesen/Schreiben des jpg files entweder verlocken (machbar), oder den jpg download ins webcam verlagern (besser).


    Die angezeigten Bilder auf dem TV Screen zeigen, daß webcam das jpg einliest, während wget die Daten noch schreibt. Es werden daher hin und wieder verkrüpelte Bilder darstellt. Ergo erkennt webcam fast immer eine Bewegung, auch wenn keine da ist.


    Locking:
    wie wäre es, wenn webcam nach dem file "wget.lock" schaut, wenn der weg ist, den file "webcam.lock" anlegt und dann jpg file einliest. Das wget-download script macht das gleiche lockfile prüfen, nur vice versa.


    Grund, screen log:


    decode /tmp/baby.jpg (640x480)
    image diff = 67.6024
    Motion detected...
    decode /tmp/baby.jpg (640x480)
    Corrupt JPEG data: premature end of data segment
    image diff = 73.2896
    Motion detected...
    Empty input file


    Nach dem "Empty input file" hat sich webcam beendet und das zuletzt ausgegebene jpg blieb im Bild eingeblendet.


    Schwellwert:
    Wenn ich die Kamera komplett verdunkle, dann wird ein diff wert von 9 angezeigt. Ein sinnvoller Schwellwert wird dann sicher irgendwo bei 20 liegen. Konnte das aber wegen dem o.g. Problem noch nicht ausprobieren.


    Mehrfachalarm:
    Du hast in eine Hysterese von 1sek eingebaut, bevor eine erneute Bewegung erkannt wird. Ich habe mich mit diesem Thema gestern Abend 1h lang beschaeftigt und bin zur Erkenntnis gekommen, dass es besser ist so lange keine Bewegung mehr zu erkennen, wenn der diff Wert mindestens 1x unter den Schwellwert gefallen ist, d.h. erst mal sicher keine Bewegung mehr da war. Nur so als Hinweis ...


    Dekodieren:
    Das Dekodieren dauert sehr lange (ca. 2 sek). Grund ist sicher die Größe der Bilder. Habe beim experimentieren festgestellt, daß man die jpgs auf 160x120 runterrechnen kann (8bit) und die Erkennung immer noch optimal ist. DJPEG kann das ja recht effizient. Danach dauert der image-compare nur noch ca. 0,25 sek.


    Meinung?


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

    5 Mal editiert, zuletzt von mamba0815 ()

  • Zitat

    muessen wir das Lesen/Schreiben des jpg files entweder verlocken (machbar), oder den jpg download ins webcam verlagern (besser).


    Dachte mir schon das es da Probleme gibt. Deshalb ist ja die nächste Stufe auch die Integration des "Bildholens" in webcam.


    Zitat

    Nach dem "Empty input file" hat sich webcam beendet und das zuletzt ausgegebene jpg blieb im Bild eingeblendet.


    Die Fehlerbehandlung der Library habe ich noch nicht verbogen. webcam fliegt also bei einem Fehler noch raus.


    Zitat

    Habe beim experimentieren festgestellt, daß man die jpgs auf 160x120 runterrechnen kann (8bit) und die Erkennung immer noch optimal ist.


    Hm, wenn ich jetzt das Bild erst runterskaliere um die Bewegung zu erkennen muss ich das ja dann nochmal für die Ausgabe in der richtigen Größe machen - bringt also nix. 8Bit Farbtiefe hat's ja eh schon. Das das so lange dauert ist allerdings komisch, geht ja PiP mit MPEG2 schneller.


    Zitat

    dass es besser ist so lange keine Bewegung mehr zu erkennen, wenn der diff Wert mindestens 1x unter den Schwellwert gefallen ist, d.h. erst mal sicher keine Bewegung mehr da war.


    So läuft das momentan ab:


    1) Bild decodieren und Bewegung erkennen
    2a) Bewegung=1 -> Ausgabe -> 1
    2b) Bewegung=0 & momentan Bild an -> Delay -> CLS -> 1
    2c) Bewegung=0 & momentan Bild aus -> 1


    Die 1s war nur falls gar kein Bild gefunden wurde, kam falsch rüber...

    Ich bin nicht faul sondern im Energiesparmodus!

  • Wenn ihr das Bild schonmal runterrechnet (zum Vergleichen), fände ich es extrem sinnvoll, es als PiP aufm Fernseher auszuwerfen (nat. nur bei Bewegung). Wenn dies schneller geht, läuft dann das Bild flüssiger - auch während des weiteren Vergleiches im Hintergrund. Wenn ich das Bild dann per Tastendruck aufs Vollbild hole, braucht man für die Zeit des Vollbilds auch keinen Vergleich mehr im Hintergrund machen - solange Vollbild - solange fortlaufende Darstellung. Wenn dann per Tastendruck das Bild weggemacht oder andere Taste das Bild wieder auf PiP-Größe reduziert wird, dann findet auch wieder der Vergleichsmechanismus Anwendung. Das würde doch die Performance einer flüssigen Darstellung extrem verbessern.


    1. lt. Mamba wirds im kleinen Bild auch mit Bildanalyse schneller


    2. Im großen Bild wirds ohne Bildanalyse schneller - ich will ja bei Volldarstellung eh sehen, was los ist - mich auch mal so an meiner Kleinen erfreuen etc. - Da brauch ich auch keine Analyse - das Bild soll im Vollbild gar nicht weggehen.


    LazyT Für die Darstellung 1 könntest du doch deine PiP-Routinen schon so ähnlich verwenden - so mit Größe - Darstellungsort etc. - Man bräuchte doch das Rad nicht neu erfinden - die Teile, die man so bräuchte sind doch alle schon perfekt gelöst, nat. nur, wenn du nichts dagegen hättest. Die Bildgrößen, die du dort so nimmst, können doch auch gleich für die Bildanalyse hergenommen werden - auch wenn das Bild gerade angezeigt wird... was meinst du?

    DM7000 - 80GB-HDD - 1GB-USB-Stick - 100Mbit-LAN
    DM600 - 20GB-HDD - 100Mbit-LAN

  • Hi LazyT,


    >>Deshalb ist ja die nächste Stufe auch die Integration
    >> des "Bildholens" in webcam.


    alles klar. Danke für die Rückmeldung. Ich sehe schon: wir sind in sync. :winking_face:


    >>wenn ich jetzt das Bild erst runterskaliere um die Bewegung zu
    >>erkennen muss ich das ja dann nochmal für die Ausgabe in der
    >>richtigen Größe machen - bringt also nix.


    Wir muessen das Original-Bild (unskaliert) ausgeben, alleine schon wegen der Qualität. Zustimmung. In meinem "motion" script nutze ich die runterskalierten Bilder nur zum Bewegungserkennen, die Ausgabe auf dem TV Screen geht mit dem letzten "still.jpg" in Originalfassung.
    Ich halte dies für die beste Variante, auch aus einem anderen Grund:
    die cpu load durch die Bewegungserkennung sollte minimiert sein, d.h. wir brauchen irgendwo später in der 'main ()' ein 'sleep ()', damit der linux scheduler nicht allzu sehr ins schwitzen kommt. Das motion holt sich derzeit jeden freien cpu-time slot. Hmhm ...


    Es gibt aus meiner Sicht noch ein theoretisches Problem, was wir aber nicht lösen können. Mir sind mit 'motion' einzelne Bewegungserkennungen aufgefallen, in denen definitiv keine Bewegungen vorlagen. Grund: die Kamera hat ein nur teilweise fertiggestelltes Bild ausgegeben (wget). Dies wird im Allg. durch djpeg erkannt und als Fehler gemeldet. Seltener wird das Bild nicht als fehlerhaft erkannt, trotz Schwarzanteilen, oder verschobenen Zeilenanfaenge. Die Kamera sollte so etwas bereits abfangen. Meine 'cheesy' Grandtec schafft das nicht zu 100%. Bin aber guter Hoffnung, daß eine gute IP-CAMs das hinkriegen. Würde dieses Thema derzeit nach hinten priorisieren.


    Zum Testen des 'webcam's wäre es ideal, wenn du eine bereits im Internet verfügbar IPCAM findest, die z.b. ein Aquariumsauschnitt zeigt. So gaebe es Zeiten mit und ohne Fische ... ideal zum debuggen des source codes. Leider habe ich kein Aquarium, sonst würde ich dir meine zur Verfügung stellen. Wenn wir keine finden und du diese Idee für gut befindest, dann schaue ich mal, was ich machen kann. Meinung?


    Card
    Die Idee mit "Vergrößern" und folgenden "zeitdiskreten" streamen finde ich sehr gut. Anwendersicht! :smiling_face:
    Sollten wir aufgreifen, wenn die Grundfunktion "Bilderkennung" dargestellt ist.


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan

    7 Mal editiert, zuletzt von mamba0815 ()

  • Hi card,


    >>Eins hab ich mal Probiert, wenn ich den Link
    >>http://user:password@<ip-der-cam>/still.jpg direkt mit den richtigen
    >>Werten im I-Explorer eingebe, kommt: Seite kann nicht angezeigt
    >>werden. Ist das normal?


    Du hattest ja schon mitgeteilt, daß M$ diese Möglichkeit mit einem der letzten IE6 Updates unterbunden hat.


    Anscheinend gibt es aber eine Abhilfe, d.h. Ab IE Version 6. muss folgende Änderung über die "regedit" vorgenommen werden :
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\
    FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE]
    "iexplore.exe"=dword:00000000


    Gruß Mamba

    __________________________________
    Dreambox 800/7020, 250 GB HDD, 100 Mbit Lan