Katzenerkennung
Verfasst: Sonntag 12. März 2017, 16:52
Hallo,
ich beschäftige mich als Python-Anfänger im Zug eines Projektes
mit einer Katzenerkennung. Nach erfolgreicher Erkennung soll
die eigene Katze Zugang zu Flüssigkeit / Futter bekommen.
Die Ablaufsteuerung hardwareseitig via GPIO funktioniert.
Software: Python 2.7.9 und OpenCV 3.x
Gedanken meinerseits dazu:
1. Autostart von cat_xx.py wenn Raspi3 startet
2. Katzen-Aktivität an "Futterkrippe" wird von PIR-Bewegungsmelder an GPIO
registriert
3. Videoaufzeichnung wird gestartet und per haarcascade (frontalcatface)
Katzengesicht erfasst
4. Erfasstes, eingerahmtes Katzengesicht soll "extrahiert" / als Bild gespeichert werden
5. Auto-Modus: Vergleich mit vorhandenem Bild des Gesichtes der Katze
oder
Manuell-Modus: Zusenden des extrahierten Bildes per Mail
an Smartphone
6. Aktivierung eines GPIO-Ports zur Fortsetzung der hartware-
seitigen Ablaufsteuerung bei eigener Katze bzw.
bei fremder (nichteigene) Katze Pause von x min und
ab Punkt 2 auf ein Neues
Bis zum Punkt 3 funktioniert die test_xx.py. Bei Erfassung wird bei
Punkt 4 das komplette Kamerabild gespeichert und nicht der gerahmte
Bereich. An der Stelle geht es nicht wie gewünscht weiter.
Wie kann das erfasste Gesicht (der gerahmte Bereich) als Bild gespeichert werden?
Darüber hinaus bin ich für Vorschläge dankbar.
Es handelt sich wie gesagt um die ersten Schritte mit
sicherlich einigen Verbesserungsmöglichkeiten.
Vielen Dank vorab.
anbei der Code der test_xx.py:
[codebox=python file=Unbenannt.txt]
# -*- coding: utf-8 -*-
# Import der benötigten Pakete
import sys
sys.path.append('/usr/local/lib/python2.7/site-packages')
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import numpy as np
filenames = 'image-{timestamp:%S}.jpg'
# Kamerainitialisierung und Festlegung von Auflösung und Wiederholrate
camera = PiCamera()
camera.resolution = (320, 240 )
camera.framerate = 25
# Kamera(Bild)-Drehung (Kamera liegt während der Programmierung "kopfüber"
camera.rotation = 180
rawCapture = PiRGBArray(camera, size=(320, 240))
cat_cascade = cv2.CascadeClassifier('./haarcascade_frontalcatface.xml')
# Pause für Kamera-aktivierung
time.sleep(0.5)
# Kameraaufzeichnung
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
image = frame.array
# Bildumwandlung in Graustufen;
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = cat_cascade.detectMultiScale(gray,
scaleFactor=1.3,
minNeighbors=9,
minSize=(75, 75))
# Erstellung des Rahmens um die Gesichter
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
print "{0} Aktivitaet(en) vor der Kamera".format(len(faces))
if len(faces) > 0:
print "weiter"
cv2.imshow('frame',image)
#cv2.imshow('gray',gray)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
if key == ord("q"):
break
cv2.waitKey(0)
cv2.destroyAllWindows()
[/code]
ich beschäftige mich als Python-Anfänger im Zug eines Projektes
mit einer Katzenerkennung. Nach erfolgreicher Erkennung soll
die eigene Katze Zugang zu Flüssigkeit / Futter bekommen.
Die Ablaufsteuerung hardwareseitig via GPIO funktioniert.
Software: Python 2.7.9 und OpenCV 3.x
Gedanken meinerseits dazu:
1. Autostart von cat_xx.py wenn Raspi3 startet
2. Katzen-Aktivität an "Futterkrippe" wird von PIR-Bewegungsmelder an GPIO
registriert
3. Videoaufzeichnung wird gestartet und per haarcascade (frontalcatface)
Katzengesicht erfasst
4. Erfasstes, eingerahmtes Katzengesicht soll "extrahiert" / als Bild gespeichert werden
5. Auto-Modus: Vergleich mit vorhandenem Bild des Gesichtes der Katze
oder
Manuell-Modus: Zusenden des extrahierten Bildes per Mail
an Smartphone
6. Aktivierung eines GPIO-Ports zur Fortsetzung der hartware-
seitigen Ablaufsteuerung bei eigener Katze bzw.
bei fremder (nichteigene) Katze Pause von x min und
ab Punkt 2 auf ein Neues
Bis zum Punkt 3 funktioniert die test_xx.py. Bei Erfassung wird bei
Punkt 4 das komplette Kamerabild gespeichert und nicht der gerahmte
Bereich. An der Stelle geht es nicht wie gewünscht weiter.
Wie kann das erfasste Gesicht (der gerahmte Bereich) als Bild gespeichert werden?
Darüber hinaus bin ich für Vorschläge dankbar.
Es handelt sich wie gesagt um die ersten Schritte mit
sicherlich einigen Verbesserungsmöglichkeiten.
Vielen Dank vorab.
anbei der Code der test_xx.py:
[codebox=python file=Unbenannt.txt]
# -*- coding: utf-8 -*-
# Import der benötigten Pakete
import sys
sys.path.append('/usr/local/lib/python2.7/site-packages')
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import numpy as np
filenames = 'image-{timestamp:%S}.jpg'
# Kamerainitialisierung und Festlegung von Auflösung und Wiederholrate
camera = PiCamera()
camera.resolution = (320, 240 )
camera.framerate = 25
# Kamera(Bild)-Drehung (Kamera liegt während der Programmierung "kopfüber"
camera.rotation = 180
rawCapture = PiRGBArray(camera, size=(320, 240))
cat_cascade = cv2.CascadeClassifier('./haarcascade_frontalcatface.xml')
# Pause für Kamera-aktivierung
time.sleep(0.5)
# Kameraaufzeichnung
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
image = frame.array
# Bildumwandlung in Graustufen;
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = cat_cascade.detectMultiScale(gray,
scaleFactor=1.3,
minNeighbors=9,
minSize=(75, 75))
# Erstellung des Rahmens um die Gesichter
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
print "{0} Aktivitaet(en) vor der Kamera".format(len(faces))
if len(faces) > 0:
print "weiter"
cv2.imshow('frame',image)
#cv2.imshow('gray',gray)
key = cv2.waitKey(1) & 0xFF
rawCapture.truncate(0)
if key == ord("q"):
break
cv2.waitKey(0)
cv2.destroyAllWindows()
[/code]