Hallo zusammen,
auf der Suche nach Lösungen habe ich dieses Forum gefunden.
Meine Katze hat mich ganz dolle lieb und bringt mir fast täglich ihre Spielsachen nach Hause.
Als Grundlage diverser Lösungen mit Raspberry (JoakimSoderberg - catcierge, Tony DiCola - pi-facerec-box, PiVision......) würde ich gern eine andere Idee mit der eingebauten Katzentür mit 12cm langem Tunnel verwirklichen:
- Per PIR Sensor soll die NoIR Kamera ausgelöst werden (funktioniert) und vorher IR LED's eingeschaltet werden (sollte kein Problem sein)
- Per GPOI soll ein Servo gesteuert werden um die Tür auf der Innenseite zu verriegeln (funktioniert)
Wo ich nun aber, auch auf Grund meiner mangelhaften Englischkenntnisse scheitere, ist der Punkt Bildauswertung.
Mit OpenCV kann der PI zwar inzwischen Gesichter erkennen, aber keine Katze....
Ich denke, das schlaueste wäre ein schneller Vergleich zweier Bilder. Wenn die Katze durch den Tunnel reinkommt, müsste ihr Profil eigentlich immer an der fast gleichen Stelle in der Höhe sein. Die Position könnte ich eventuell mit -roi 0.5,0.5,0.25,0.25 begrengen, dass es "nur ein S/W Foto" wird mit --colfx 128:128 festlegen.
Nun gäbe es die Möglichkeit per (aus Imagmagick) compare -metric rmse a.jpg b.jpg null: die zwei Fotos zu vergleichen, doch die Werte werden nur im Terminal ausgegeben, auch die Umleitung mit >> diff.txt ist nicht möglich. Mein Gedanke war, per Schleife die diff.txt auszulesen, einen Grenzwert festzulegen und entsprechend den Servo zu steuern.
Was ich nun suche, ist eine Möglichkeit die Differenz der Foto's zu bestimmen und in eine Datei um zu leiten.
Würde so etwas mit Python gehen? Hat jemand eine Idee dazu?
Viele Grüsse
lopo
Katzentür mit Mauserkennung
Nee, ich bevorzuge eher Hunde. Aber ich weiß trotzdem, dass Katzen gerne mal tierische Geschenke nach Hause bringen. Ich fand die Idee an sich einfach originell. Und beim Lesen deiner detaillierten Gedankengänge zu dem Thema musste ich schmunzeln.
Hi snafu,
was bei den erwähnten anderen Lösungen etwas nervt:
Bei der pi-facerec-box nimmt Tony DiCola Raspbian testing. Nach der Installation/Upgrade funktionieren fast alle Module von OpenCV nicht.
train.py schreibt zwar:
eading training images...
Read 0 positive images and 400 negative images.
Training model...
Training data saved to training.xml
Aber die Kamera geht nicht einmal an, ich hatte erwartet, dass ein oder mehrere Foto's zum Training "geschossen" werden, um z.B. die Katze "anzulernen" wenn sie im Tunnel ist.
Irgendwie habe ich Mühe, die Software zu verstehen.
Bei catcierge ist es ähnlich: Der Entwickler hat einen RFID Leser selbst gebaut, aber das will ich nicht, weil die Katzentür den selbst hat.
Bei dem kompilieren kommen dann auch Fehler ohne Ende.
Eines der Probleme ist halt auch, je nach alter des Projekts ist es für Raspberry 1, b, b+ oder 2.
Was sich nie im Voraus sagen lässt, hab ich das Gefühl.
Gruss
lopo
was bei den erwähnten anderen Lösungen etwas nervt:
Bei der pi-facerec-box nimmt Tony DiCola Raspbian testing. Nach der Installation/Upgrade funktionieren fast alle Module von OpenCV nicht.
train.py schreibt zwar:
eading training images...
Read 0 positive images and 400 negative images.
Training model...
Training data saved to training.xml
Aber die Kamera geht nicht einmal an, ich hatte erwartet, dass ein oder mehrere Foto's zum Training "geschossen" werden, um z.B. die Katze "anzulernen" wenn sie im Tunnel ist.
Irgendwie habe ich Mühe, die Software zu verstehen.
Bei catcierge ist es ähnlich: Der Entwickler hat einen RFID Leser selbst gebaut, aber das will ich nicht, weil die Katzentür den selbst hat.
Bei dem kompilieren kommen dann auch Fehler ohne Ende.
Eines der Probleme ist halt auch, je nach alter des Projekts ist es für Raspberry 1, b, b+ oder 2.
Was sich nie im Voraus sagen lässt, hab ich das Gefühl.
Gruss
lopo
Hi Sirius3,
öhm, könntest Du mir das eventuell näher erklären?
Du scheinst da was zu wissen, was ich nicht weiss. :K Oder den Wald nicht sehe.....
compare -metric rmse a.jpg b.jpg null: und dann? Eventuell wäre mein Problem schon gelöst.
compare ist bei der Bildgrösse von ~75 KB und S/W recht fix, etwa 1 Sek.
Gruss
lopo
öhm, könntest Du mir das eventuell näher erklären?
Du scheinst da was zu wissen, was ich nicht weiss. :K Oder den Wald nicht sehe.....
compare -metric rmse a.jpg b.jpg null: und dann? Eventuell wäre mein Problem schon gelöst.
compare ist bei der Bildgrösse von ~75 KB und S/W recht fix, etwa 1 Sek.
Gruss
lopo
@lopo: Du mußt halt statt stdout stderr auslesen:
oder wie auch immer Du das in Deinem Programm bisher gelöst hast.
Code: Alles auswählen
_, output = subprocess.Popen(["compare", "-metric", "rmse", bildA, bildB, "null"], stderr=subprocess.PIPE).communicate()
Hi Sirius3,
Dein Tip war super!!! Danke!
Allerdings: ich mach das erstmal in der Shell.
Die Shell geht ganz erheblich schneller als Python, allein schon das Foto "schiessen".
In der diff.txt nun: 23223.8 (0.354372)
Nun noch mit grep und sed bearbeiten, damit nur der Wert 0.354372 in der Datei steht.
Ich glaub, Python wäre schon sehr interessant, aber da muss ich noch viel lesen.
Gruss lopo
Dein Tip war super!!! Danke!
Allerdings: ich mach das erstmal in der Shell.
Code: Alles auswählen
#!/bin/bash
raspistill --colfx 128:128 -w 480 -h 240 -q 50 -t 5000 -vs -o snapshot.jpg
compare -metric rmse image_positiv.jpg snapshot.jpg null: &> diff.txt
exit 0
In der diff.txt nun: 23223.8 (0.354372)
Nun noch mit grep und sed bearbeiten, damit nur der Wert 0.354372 in der Datei steht.
Ich glaub, Python wäre schon sehr interessant, aber da muss ich noch viel lesen.
Gruss lopo
Naja, statt `grep` und `sed` könnte man halt Python-Boardmittel zur String-Verarbeitung nutzen. Eine Befehlszeile in einen Aufruf des `subprocess`-Moduls in Python zu übersetzen, ist auch nicht wirklich kompliziert, wenn man einmal weiß, wie man es machen muss.
Wie gesagt: Das Aufbereiten von Progamm-Ausgaben ist mit Python oftmals schöner als mit den üblichen Shell-Tools. Lediglich das Umleiten des Ausgabeflusses (Stichwort: Pipes) ist mit den entsprechenden Umleitungssymbolen der Shell hübscher anszusehen. Dies müsste man bei `subprocess` in entsprechende Parameter und Methoden-Aufrufe übersetzen.
Falls es hier um die Verarbeitungszeit geht, so kann ich mir das nur schwer vorstellen. Wenn man nicht etwas grundlegendes falsch gemacht hat, dann ist der Programm-Aufruf aus Python heraus ähnlich schnell wie aus einere Shell. Es ist halt nur schneller als Shell-Befehl hingeschrieben.lopo hat geschrieben:Die Shell geht ganz erheblich schneller als Python, allein schon das Foto "schiessen".
Wie gesagt: Das Aufbereiten von Progamm-Ausgaben ist mit Python oftmals schöner als mit den üblichen Shell-Tools. Lediglich das Umleiten des Ausgabeflusses (Stichwort: Pipes) ist mit den entsprechenden Umleitungssymbolen der Shell hübscher anszusehen. Dies müsste man bei `subprocess` in entsprechende Parameter und Methoden-Aufrufe übersetzen.
Hi snafu,
ich gugg das in den nächsten Tagen an, versprochen.
Aber als erstes muss erst mal der eine PI laufen und die Katzentür dicht machen.
Da ich noch mal den gleichen habe, kann ich dort mit Python anfangen zu lernen.
Bisher bisher habe ich mir nur das eine und andere angesehen .... und meist gegrübelt: was machen die da???
Alles was nicht die Hardware des Pi betrifft, kann ich hier am Laptop machen - bin ausschliesslich mit Linux unterwegs.
Gute Nacht und vielen Dank für Heute
lopo
ich gugg das in den nächsten Tagen an, versprochen.
Aber als erstes muss erst mal der eine PI laufen und die Katzentür dicht machen.
Da ich noch mal den gleichen habe, kann ich dort mit Python anfangen zu lernen.
Bisher bisher habe ich mir nur das eine und andere angesehen .... und meist gegrübelt: was machen die da???
Alles was nicht die Hardware des Pi betrifft, kann ich hier am Laptop machen - bin ausschliesslich mit Linux unterwegs.
Gute Nacht und vielen Dank für Heute
lopo