Projekt HugLamp

Aktueller Status des Projekts HugLamp das später ein Jahr lang in Wien installiert werden soll und jeden Tag von 9 - 24 Uhr Laufen soll. Es soll aus etwa 4m Höhe erkennen wenn sich Leute unter einer Straßenlaterne umarmen und dann soll ein Relay getriggert werden RGB Leds in eine andere Stimmung schaltet.

  1. Wir haben den Kinect Treiber auf dem Raspberry Pi zum Laufen gebracht

Hier die Anleitung von Joni:

  1. Wir haben festgestellt dass die Kinect v1 bei etwas Sonnenlicht im Freien nichts erkennt, sodass wir bei Sonnenlicht auf die RGB Images zurückgreifen werden und dann bei Dunkelheit auf die Tiefeninformationen

  2. Erstes versuche von Nikolas das Umarmen zu erkennen mit einer normalen Webcam und 2D Images. Die Bilder waren hier noch nicht Life sondern aus einem Folder.

fgbg.py (1.7 KB)

  1. Wir haben einen ersten Test bei der Erfindergarden Tram gemacht und eine Plastikbox gebaut mit Löchern für die Kameras und Fotos aufgenommen

Das programm dazu ist hier: capture_test.py (858 Bytes)

den Autostart haben wir mit crontab -e konfiguriert und auch noch einen Dropboxuploader installiert (https://github.com/andreafabrizi/Dropbox-Uploader)

crontab -e in der Command Line tippen und dort konfigurieren wann das script ausgeführt wird.

   #@reboot python /home/pi/capture_10.py
*/15 * * * * /home/pi/Dropbox-Uploader/./dropbox_uploader.sh -s upload /home/pi$
  1. Joni hat ein erstes Programm geschrieben das Live die 2D Daten aufbereitet und @maxl probiert es jetzt fertig zu machen und auch das Programm auch noch für die Tiefendaten zu erweitern. Es muss jetzt noch die Frames verglichen werden auf Veränderungen

rgb_extract.py (1.5 KB)

  1. Andreas hat bereits ein Relay angeschlossen an der Pi um einen LED Strip an und aus zu schalten.

hugme.py (2,8 KB)

Hier der aktuelle Stand. Ziel ist es sich die beiden größten Blobs zu merken und ihre Distanz und dann deren Vereinigung zu registrieren. Tue mir im Moment noch etwas schwer mit der Python Klassen-Syntax. Labels Window habe ich ausgeblendet, da es nichts angezeigt hat. Ich bin mir noch nicht sicher bzgl. der Stabilität, da die Bibliothek nach einer gewissen Zeit sehr viele dieser Invalid Magic Fehler schmeißt. Eventuell muss ein regelmäßiger Reset mit eingebaut werden oder ein selbstprogrammierter Watchdog, der den Prozess neu startet, wenn er nicht mehr läuft.

1 „Gefällt mir“

rgb_extract_hug_2.py (4,7 KB)

Hier die aktuelle Version, die im besten Fall schon halbwegs die Bewegung erkennt. Leider ist die Blob-Erkennung nicht 100% korrekt oder ich habe noch einen Bug drin. Manchmal erkennt er nur einen von beiden Blobs. Der Algoritmus ist noch sehr einfach und kann sicher noch viel besser werden. Momentan ist z.B. noch nicht bedacht, dass sich zwei Personen mit offenen Armen schon vor der Umarmung zu einem Blob vereinen, sobald sich die Arme irgendwo überscheiden. Das könnte man noch testen, indem man die Pixeldichte des Endblobs bestimmt mit Pixelanzahl (Wert Area aus Stats) / Breite*Höhe. Idealerweise schaut sich das Joni auch nochmal an. Liebe Grüße :slight_smile:

Offene Punkte:

  • Stabilität durch regelmäßigen Neustart des Skripts (eventuell wenn vorher eine Zeit lang keine Blob mehr gefunden wurde (aka. keiner spielt gerade damit)

  • Gleicher Test mit Tiefenbild, wenn normales Bild keine Blobs (zur Zeit) liefert, weil zu dunkel

  • Alle Raspberries in ein WLAN einbinden, damit wir im Notfall draufschauen und Updates einspielen können

  • Werte (Threshold, Pausen, usw.) anpassen, IO Pin ansteuern für Relay

2 „Gefällt mir“

Für die Arme meint Joni wir sollen noch eine größere binary Erosion machen 20x20 statt 9x9. Bin gespannt ob wir das heute Abend bei der Tram läuft.

Eigentlich müssten wir die Kamera in der selben Höhe aufhängen, wie es auch in der Installation hängt, dann könnte man schon mal alle Werte anpassen wir Threshold und erlaubte Größe der Blobs, die einen Menschen darstellen können. Waren das vier Meter? Ich würde heute Abend gerne noch das Script anpassen, damit das Tiefenbild verwendet wird, sobald das normale Bild nichts liefert und nochmal schauen, warum er manchmal nur einen statt zwei Blobs erkennt. Auch die Zeiten müssen wir messen, wie lange die Verarbeitung eines Bildes braucht (ohne die Testfenster), damit wir im richtigen Abstand die Bewegung aufeinander zu messen und schnelle wie langsame Umarmungen korrekt erfasst werden. Eventuell muss dafür auch der FIFO vergrößert werden, der sich die vorherigen Abstände merkt (pre_distances).

Ja genau, 4m, habs hier aktuell frontal stehen, Erkennung ist mal, mal nicht. So bei 2m Abstand tut es, weiter hinten eher nicht.

Ich denke der Reset/Neustart könnte auch direkt nach einer erfolgreichen Erkennung erfolgen, hier haben wir ja ein 5sekunden Fenster, bevor er wieder neu erkennen soll.

Das er nach “Licht an” nach 5sekunden wieder erkennen soll ist gewünscht, Umarmungen dauern in der Regel nicht länger.

Andi kannst du im hinteren Teil des Zuges montieren um mit den 4m zu testen ?

Im letzten Skript war noch ein Bug drin, deshalb hat er manchmal nur einen Blob registriert. Hier das aktuelle, das deutlich besser funktionieren sollte.kinect_hugme.py (5,4 KB)

1 „Gefällt mir“

Kleinere Verbesserungen

kinect_hugme.py (5,6 KB)

1 „Gefällt mir“

Hier das Skript mit aktiviertem Depthbild.kinect_hugme.py (6,2 KB)

1 „Gefällt mir“

Hallo Max, mit der Version hab ich keinen Erfolg bei der Erkennung des zweiten Blobs, wie ist denn der treshold aktuell ? 1m ?

Beim Tiefenbild erkennt die Bibliothek komischerweise oft nicht den zweiten Blob. Eventuell liegt es am Erode. Ich frage mich, ob wir den da überhaupt brauchen, weil es beim Tiefenbild in der Hinsicht ja kein Hintergrundbild gibt, von dem subtrahiert werden muss. Das wäre ne Frage für Joni. Threshold und Depth kannst du mit einem Demoskript einstellen, das ich leider gerade nicht an der Hand habe. Andi kann dir das aber geben.

jetzt machen wir erstmal Version 1 aber so ein neurales Netzwerk wäre dann Version 2.0

https://www.google.com/search?q=opencv+neural+network+example&oq=open+cv+neuro&aqs=chrome.2.69i57j0l5.9225j0j0&sourceid=chrome&ie=UTF-8

@abrahamananda

wie hast du opencv installiert?

sudo apt-get install opencv-python


geht bei mir nicht ... 

jetzt ging es mit …

sudo apt-get install python-opencv (ist anders herum als in Jonis Anleitung)

Allerdings bekommt man so nicht die neueste Opencv Version als wenn man die neueste Version von Source kompiliert. Das könnte vielleicht auch das Problem sein warum wir nicht alle Blobs erkennen. Mit apt-get bekommen wir 3.2.0 aber es gibt schon 4.1.1 …

https://docs.opencv.org/3.4/d2/de6/tutorial_py_setup_in_ubuntu.html

sudo apt-get install build-essential python-dev ipython python-opencv

aber ein git clone ist wohl am besten

@andreasK

Wie ist denn jetzt der Stand mit Relays Integrierung, automatischer nächster Blob Erkennung nach Licht an ?

hab gestern nicht mehr das Relay aus dem Container geholt, weil ich noch nicht opencv am laufen hatte. Ich kompiliere es gerade und fahr dann am Nachmittag hinter. @maxl wollen wir uns später an der Tram treffen für einen Live test? Ich hoffe am Abend regnet es nicht.

Update: Die zweite kinect scheint nicht zu funktionieren probiere es jetzt mit der 2er.

Update2: jetzt geht die Kinect 1. Man muss die scripte mit sudo starten.

1 „Gefällt mir“

so kann man die python programme ohne sudo starten … danke @Joni

To use Kinect as a non-root user do the following:
sudo adduser $USER video
Also make a file with rules for the Linux device manager:
sudo nano /etc/udev/rules.d/51-kinect.rules
Copy and paste:

ATTR{product}==“Xbox NUI Motor”

SUBSYSTEM==“usb”, ATTR{idVendor}==“045e”, ATTR{idProduct}==“02b0”, MODE=“0666”

ATTR{product}==“Xbox NUI Audio”

SUBSYSTEM==“usb”, ATTR{idVendor}==“045e”, ATTR{idProduct}==“02ad”, MODE=“0666”

ATTR{product}==“Xbox NUI Camera”

SUBSYSTEM==“usb”, ATTR{idVendor}==“045e”, ATTR{idProduct}==“02ae”, MODE=“0666”

ATTR{product}==“Xbox NUI Motor”

SUBSYSTEM==“usb”, ATTR{idVendor}==“045e”, ATTR{idProduct}==“02c2”, MODE=“0666”

ATTR{product}==“Xbox NUI Motor”

SUBSYSTEM==“usb”, ATTR{idVendor}==“045e”, ATTR{idProduct}==“02be”, MODE=“0666”

ATTR{product}==“Xbox NUI Motor”

SUBSYSTEM==“usb”, ATTR{idVendor}==“045e”, ATTR{idProduct}==“02bf”, MODE=“0666”

Letzter Stand mit zusätzlichen Kommentaren.

kinect_hugme.py (6,9 KB)

1 „Gefällt mir“

For Fiore we are using python 2.7.16 and OpenCV 3.2.0.

We got Problems with this cv2.connectedComponentsWithStats.