====== Magic Mirror I ====== ==== Beschreibung: ==== In diesem Projekt soll ein MagicMirror (intelligenter Spiegel) entstehen. Er soll mittels Sprachsteuerung bedienbar sein und per Gesichtserkennung sollen Benutzer erkannt und angesprochen werden. Startet man das Programm, so wird die Person vor dem Spiegel durch die Raspberry Pi Camera erkannt. Sollte die Person nicht bekannt sein so besteht die Möglichkeit die Person noch im selben Moment als Benutzer anzulegen. Wenn die Person erkannt wurde, startet die MagicMirror Software benutzerdefiniert. ==== Bauteile: ==== **• Raspberry Pi Camera\\ • Monitor (inkl. HDMI-Kabel)\\ • Mikrofon\\ • Lautsprecher\\ • USB-Soundkarte\\ • Und natürlich der Raspberry Pi 3** {{ :magicmirror_fritzing_steckplatine.jpg?nolink}} ==== Verwendung: ==== __**Ohne Sprachsteuerung:**__\\ • Vorab: alle Quellcodeteile müssen sich im selben Verzeichnis befinden.\\ • Das Programm „fotoschiessen.py“ wird über den Befehl „python3 fotoschiessen.py“ ausgeführt\\ • Das Programm fragt, ob die Person vor der Kamera bereit ist fotografiert zu werden, um das Foto mit den bekannten Benutzern abzugleichen.\\ • Geantwortet wird über die Tastatur. Wenn ein "j“ für ja eingegeben wird geht es weiter. Bei einem anderen Ausdruck fragt das Programm nochmals, ob man bereit ist.\\ • Wenn es weiter geht, startet entweder die MagicMirror Software wenn ein Benutzer erkannt wurde benutzerdefiniert oder das Programm fragt, ob es einen neuen Benutzer anlegen soll. Bei der Antwort ja bzw. „j“ fragt es ebenfalls nach dem Namen mit dem es den neuen Benutzeranlegen soll.\\ • Wurden diese Schritte abgearbeitet, muss das Programm erneut ausgeführt werden und der neue Benutzer kann den Spiegel dann „ordnungsgemäß“ verwenden\\ \\ __**Mit Sprachsteuerung:**__\\ • Gesamte Steuerung, die momentan über Tastatur möglich ist sollte über Sprache funktionieren:\\ • Man könnte dann später im MagicMirror bspw. nahc der Uhrzeit oder dem Wetter fragen\\ • Daraufhin würde der Pi dem Benutzer die Antwort geben \\ ==== Code-Ausschnitte: ==== #!/usr/bin/perl # Dieses Programm muss als aller erstes gestartet werden. # Import der Bibliothek "os". import os # Wenn das Programm gestartet wurde, fragt es den zuerst ob man Bereit ist ein Foto zu schießen. # Die Antwort des Benutzers wird in der Variable "antwort" gespeichert. antwort = input("Bereit? Ja(j) oder nein(n)?") # Variable "q" bekommt den Wert "True" für die folgende while-Schleife. Dadurch wird diese zu einer Dauerschleife. q = True while q: # Wenn die Antwort "Ja"(j) lautet, wird ein Bild mit dem Standardbefehl für die Kamera gemacht. Alternativ auch mit der Python Kamera funktion möglich ( aber mehr zeilen) # Nachdem das Bild gemacht wurde wird "q" auf "False" gesetzt, sodass die Schleife abbricht und der Code weiterläuft. if antwort == "j": # -o speichert im aktuellen Ordner, -n = ohne Vorschau, -t = zeit bis zum erzeugten Foto, -w und -h = Breite und Höhe des Fotos os.system('raspistill -o unbekannt.jpg -n -t 1000 -w 640 -h 480') q = False # Sollte die Antwort nicht "j" sein wird der Benutzer noch einmal gefragt ob er "jetzt fertig ist". else: antwort = input("Jetzt?") # Wenn das Prgramm nicht abgebrochen wurde und die Antwort an einer Stelle "j" war, dann pausiert das Programm eine Sekunde um alle Änderungen zu übernehmen.(Klappte ohne "sleep"-Befehl nicht!) os.system('sleep 1') # Als finaler Schritt wird dasProgramm "bildabgleich.py" ausgeführt. os.system('python3 bildabgleich.py') #!/usr/bin/perl # Vorab: Die mit den geklammerten Zahlen ((1),(2),(3),(4),(5),(6)) markierten Kommentare dienen einzig und allein als Textmarke für die Datei "neuer_benutzer.py" #-----------------------------------------------------------# ########################## Imports ########################## #-----------------------------------------------------------# import face_recognition import os import compliments #-----------------------------------------------------------# ######################### Variablen ######################### #-----------------------------------------------------------# os.chdir('/home/pi/MagicMirror/modules/default/compliments') openfile = open("compliments.js", "r") zeilei = openfile.readlines() os.chdir('/home/pi/Desktop/SkripteProjekt') #-----------------------------------------------------------# ################## Funktion listeauslesen() ################# #-----------------------------------------------------------# # Die Funktion speichert die Länge der Liste "listeresult" in der Variablen "j". # Durch "str" wir die Variable in einen String konvertiert, da sie sonst nicht geschrieben werden kann. # Die Datei "temp.txt" wird beschreibbar ("w") geöffnet und in der Variablen "r" gespeichert. # Danach wird "j" in diese Datei geschrieben und die Datei anschließend wieder geschlossen. def listeauslesen(): j = len(listeresult) j = str(j) r = open("temp.txt", "w") r.writelines(j) r.close() #hier würde die angepasste (im Sinne von Variablen austauschen) Gesichtserkennung aus: https://github.com/ageitgey/face_recognition/blob/master/examples/recognize_faces_in_pictures.py zum Tragen kommen. #-----------------------------------------------------------# ################# kann MagicMirror starten? ################# #-----------------------------------------------------------# # die Nächste if-Schleife nimmt den Wert aus der Variablen "..._result" und prüft, ob der Wert mit "True" übereinstimmt. # Sollte das der Fall sein, wird die Datei "temp.txt" beschreibbar ("w") geöffnet und der Variable "u" gespeichert. Wenn der erste Benutzer nicht mit "True" übereinstimmt wird weitergemacht bis man beim "else" ankommt. # Danach wird in diese Datei einfach der am Anfang eingegebene Name in die Datei geschrieben. Dann wird die Datei wieder geschlossen. # Durch die "os..." Befehle wird als nächstes das Verzeichnis gewechselt und dann die MagicMirror Software ausgeführt. if benutzer1_result == "True": print('Erkannt: benutzer1') u=open("temp.txt", "w") u.writelines("benutzer1") u.close() compliments.variableeinfuegen("compliments.js", zeilei, "benutzer1") compliments.ifschleifeeinfuegen("compliments.js", zeilei, "benutzer1") os.chdir('/home/pi/MagicMirror') os.system('npm start') elif benutzer2_result == "True": print('Erkannt: Benutzer2') u=open("temp.txt", "w") u.writelines("benutzer2") u.close() compliments.variableeinfuegen("compliments.js", zeilei, "benutzer2") compliments.ifschleifeeinfuegen("compliments.js", zeilei, "benutzer2") os.chdir('/home/pi/MagicMirror') os.system('npm start') #resultabfragen (6) # Wurde vorher kein Benutzer gefunden, gelangt man zum "else" der if-Schleife. # Als erstes wird ausgegeben, dass kein gültiger Benutzer gefunden wurde. Danach besteht die Möglichkeit einen neuen Benutzer hinzuzufügen! # Lautet die Antwort des Benutzers "Ja"(j) wird das Programm "neuer_benutzer.py" gestartet. Bei anderen Antworten bricht das Programm ab. else: print('Kein gültiger Benutzer!') neu = input("Wollen Sie einen neuen Benutzer hinzufügen?") if neu == "j": os.system('python3 neuer_benutzer.py') else: print("Schließe das Programm...") openfile.close() #!/usr/bin/perl #-----------------------------------------------------------# ################ Funktion "neuer_benutzer()" ################ #-----------------------------------------------------------# # Die Funktion nimmt "datei", "zeilei" und "name" als Parameter entgegen. def neuer_benutzer(datei, zeilei, name): # foreach-Schleife # range() erstellt eine Liste aus, in diesem Fall, Zahl. Besipiel range(3) gibt: [1, 2, 3]. # Dann wird diese Liste iteriert. for i in range(len(zeilei)): # Mit der if-Schleife wird in der Liste "zeilei" nachdem Bezugswort (hier "#fotosderbenutzer") gesucht. if "#fotosderbenutzer" in zeilei[i]: # Wenn das Bezugswort gefunden wurde, erhöht man den Wert um 1, um später in die nächste Zeile springen zu können. # "i" wird dann noch einer neuen Variable "x" zugewiesen i += 1 x = i # Das in "fotoschiessen.py" erstellte Bild "unbekannt.jpg" wird in eine Bilddatei mit dem eingegebenen Namen geändert. os.system('mv unbekannt.jpg ' + name + '.jpg') # "zeilei" an der Stelle "x" bekommt den String zugewiesen, um diesen später in "bildabgleich.py" schreiben zu können. zeilei[x]= "\n" + name + ' = face_recognition.load_image_file("' + name + '.jpg")' + "\n" # neue Variable "ersetzen" öffnet dei Datei "bildabgleich.py" beschreibbar. # Funktion "writelines()" schreibt an gewünschte Stelle # ".close()" schließt zu bearbeitende Datei wieder ersetzen = open(datei, "w") ersetzen.writelines(zeilei) ersetzen.close()