Katzentür mit Mauserkennung

Du hast eine Idee für ein Projekt?
Antworten
lopo
User
Beiträge: 6
Registriert: Donnerstag 4. Juni 2015, 07:45

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich kann dir fachlich leider nicht weiterhelfen, möchte aber erwähnen, dass ich die Idee super finde...! :mrgreen:
lopo
User
Beiträge: 6
Registriert: Donnerstag 4. Juni 2015, 07:45

Hi snafu,

dann bist Du auch Katzenliebhaber?! :P
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@lopo: die Ausgabe von compare läßt sich genauso umleiten, wie üblich. Es kann nur sein, dass der Text auf stderr statt auf stdout geschrieben wird, um stdout für das Ausgabebild frei zu haben.
lopo
User
Beiträge: 6
Registriert: Donnerstag 4. Juni 2015, 07:45

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
lopo
User
Beiträge: 6
Registriert: Donnerstag 4. Juni 2015, 07:45

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
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@lopo: Du mußt halt statt stdout stderr auslesen:

Code: Alles auswählen

_, output = subprocess.Popen(["compare", "-metric", "rmse", bildA, bildB, "null"], stderr=subprocess.PIPE).communicate()
oder wie auch immer Du das in Deinem Programm bisher gelöst hast.
lopo
User
Beiträge: 6
Registriert: Donnerstag 4. Juni 2015, 07:45

Hi Sirius3,

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
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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
lopo hat geschrieben:Die Shell geht ganz erheblich schneller als Python, allein schon das Foto "schiessen".
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.

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.
lopo
User
Beiträge: 6
Registriert: Donnerstag 4. Juni 2015, 07:45

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
Antworten