Für den Raspberry Pi gibt es seit längerem eine CSI-Kamera, die mittlerweile auch als HD-Version verfügbar ist. In diesem Beitrag möchte ich einige Beispiele mit der Kamera vorstellen.
Inbetriebnahme:
Vor der ersten Inbetriebnahme der Kamera muss das Kamerainterface unter Interfaces
im Menü raspi-config
aktiviert werden:
Nach einem Reboot steht das Interface zur Verfügung und kann genutzt werden. Über eine Installation der Video4Linux-API kann die Kamera wie ein normales Video-Device genutzt werden.
$ sudo apt-get update $ sudo apt-get install v4l
Nach einem Reboot wird die Kamera unter /dev
als Video-Device gelistet:
$ ls /dev
Wenn ein Gerät namens video0
angezeigt wird, kann die Webcam genutzt werden:
Auslesen der Kamera:
Das erste Programm soll das aktuelle Bild der Webcam aufnehmen und speichern. Dies soll mit der Bibliothek OpenCV erfolgen, welche installiert (oder als optimierte Version kompiliert) werden muss:
$ sudo apt-get update $ sudo apt-get install libopencv-de
Durch das Modul opencv wird der Zugriffprozess auf die Webcam und der Bildbearbeitung stark vereinfacht und es kann über
Mat Frame; VideoCapture Camera(0); if (!Camera.isOpened()) { return -1; } Camera >> Frame;
die Webcam geöffnet und ein Bild eingelesen werden. Die 0 steht dabei für die Nummer der Webcam, sprich wenn die Kamera als /dev/video1
erkannt wird, muss dort eine 1 stehen.
Dieses Bild kann nach dem Auslesen in einem Fenster angezeigt werden:
namedWindow("Display Image", WINDOW_AUTOSIZE); imshow("Display Image", Frame); waitKey(0);
Durch die Nutzung der V4L-API lässt sich die Raspberry Pi Kamera somit wie eine ganz normale Webcam nutzen und mit einer Kombination mit OpenCV lässt sich eine Weiterverarbeitung des Kamerabildes implementieren.
Die Kamera zur Schrifterkennung nutzen:
Über die Raspberry Pi Kamera kann auch eine Schrifterkennung realisiert werden. Diesen Ansatz habe ich vor einiger Zeit für einen automatischen Auslesemechanismus eines Stromzählers (die Analogen mit der drehenden Scheibe) gesehen. Doch die kann man eine Schrifterkennung (in einfach) umsetzen?
Für die Schrifterkennung wird ein Open Source Tool namens Tesseract genutzt.
$ apt-get update $ sudo apt-get install tesseract-ocr tesseract-ocr-deu
Die Software liest ein vorhandenes Foto aus und schreibt den erkannten Text in eine Textdatei. Um einen Auslesevorgang zu starten, reicht folgender Befehl:
$ tesseract <Bild>.jpg Ausgabedatei
Zum Testen habe ich mit der Raspberry Pi Kamera ein Foto gemacht und dieses anschließend analysiert:
$ dd if=/dev/video0 of=Foto.jpg bs=11M count=1 $ tesseract Foto.jpg Text
Die Ausgabe sieht sehr vielversprechend aus:
An für sich funktioniert die Software auch ganz gut. Wenn trotzdem mal Ausleseprobleme bestehen sollten, liegt es mit sehr großer Wahrscheinlichkeit am Licht bzw. am Kontrast, sodass die Software keinen Text erkennen kann.
Dazu ein Beispiel:
Grundsätzlich sollten glänzende Oberflächen vermieden werden und es sollte darauf geachtet werden, dass die Oberflächen möglichst kontrastreich sind. Dies kann z. B. durch eine vorherige Konvertierung in ein Schwarz-Weiß Bild erreicht werden.
Hi Daniel
versuche gerade eine Webcam anzusprechen.
Habe python-opencv installiert und die Webcam angeschlossen.
Sie wird wie beschrieben erkannt (video0).
Die Datei Kamera.py habe ich kopiert und gestartet.
Leider kommt in der Python Shell folgende Fehlermeldung:
ImportError: No module named cv
Was habe ich falsch gemacht ?
Gruß Fritz
Hallo Fritz,
schau dir mal das Beispielprogramm, welches unten verlinkt ist, an.
Hast du am Anfang von deinem Programm „import cv“ geschrieben?
Gruß
Daniel
Hey Daniel,
natürlich habe ich „import cv“ geschrieben, sonst stände ja nicht
ImportError, offenbar findet das Programm nicht das Modul cv.
Könnte es wieder mal an Python 3 liegen. Werde es heute mal mit
Python 2 probieren.
Gruß Fritz
Ja,
es lag an python3. Mit Python2 klappts.
Werde Python3 in den Müll werfen…
Gruß Fritz
Hey,
ja Python 2 ist als Standard definiert (habe ich irgendwo mal gelesen)….glaube du musst das irgendwie umstellen, damit er Python 3 nimmt und auch dafür die Module dafür verwendet.
Wie das geht weiß ich allerdings nicht, da ich nur Python 2.7 verwende.
Gruß
Daniel
Jow Daniel,
warum kompliziert wenns auch einfach geht…
Werde in zukunft alles was mit Python 3 nicht geht
einfach mit Python 2.7 ausprobieren.
Gruß Fritz
Noch eine Ergänzung, mit folgendem Programm kann man Live-Bilder
der Webcam sehen:
import cv
KAMERA_NR = 0
cam = cv.CaptureFromCAM(0)
taste = 0
while taste ord(„q“):
bild = cv.QueryFrame(cam)
cv.ShowImage(„Livebild“, bild)
taste = cv.WaitKey(2)
Mit Taste „q“ wird das Progeamm beendet.
Gruß Fritz
Korrektur:
Nach „while…“ müssen folgende 3 Zeilen versetzt sein, also:
while taste ord(“q”):
bild = cv.QueryFrame(cam)
cv.ShowImage(“Livebild”, bild)
taste = cv.WaitKey(2)
Hier die Webseite
Webcambilder
einlesen
zum Nachlesen.
Gruß Fritz
Hey Daniel,
wenn ich mit deinem Programm einen Schnappschuß mache
ist das Blid unterbelichtet:
siehe Schnappschuß
Das Live-Bild dagegen ist normal:
siehe Live-Bild
Woran kann das liegen?
Meine Webcam: Pearl SC 834
Hast du ne Ahnung?
Gruß Fritz
Hallo Fritz,
hast du das Livebild mit einer Zusatzsoftware gemacht? Oder wie hast du das erstellt?
Gruß
Daniel
Hallo Daniel,
das Livebild habe ich kurzfristig in dem Livebild-Programm aufgenommen, einfach alle 2 Sekunden ein Bild speichern.
Also im Prinzip deine Software ins Liveprogramm integriert.
Dann mit dem Raspi Bildbetrachter angesehen und gespeichert.
Ist halt ein bisschen umständlich als Dauerlösung.
Gruß Fritz
Hey,
besteht das Problem auch wenn du andere Webcams nimmst?
Weil wenn es an der Webcam liegt ist die einzige Möglichkeit wenn du versuchst das Bild künstlich heller zu machen:
config = {
cv.CV_CAP_PROP_BRIGHTNESS: 50,
cv.CV_CAP_PROP_CONTRAST: 50,
cv.CV_CAP_PROP_SATURATION: 50,
}
for param, value in config.iteritems():
cv.SetCaptureProperty(Kamera, param, value)
Gruß
Daniel
hab nur die eine, werds mal versuchen ist aber nicht lebenswichtig -:)
Gruß Fritz
Hallo Daniel,
es hat mir keine Ruhe gelassen, aber jetzt habe ich die Lösung gefunden:
for i in range (8):
–>Bild = cv.QueryFrame(Kamera)
Man muß der Kamera Zeit lassen, dann wird das Blid
korrekt wiedergegeben, offenbar war das Bild zu kurz belichtet und deshalb zu dunkel. Wie auch immer,
jetzt klappts…
Gruß Fritz
Hallo
Habe bei diesem Programm diesen Fehler: VIDIOC_QERYMENU: Invalid argument !!!
Bitte um eure Hilfe für diesen Fehler ? DANKE
Hey,
sicher das du die richtige Webcam im Programm angegeben hast?
Gruß
Daniel