Barcodes sowie QR Codes sind heute überall zu finden, ob auf Produkten oder gar auf Visitenkarten. Die enthaltenen Informationen sind nicht mit dem Auge zu entziffern, dafür aber von Maschinen lesbar. De Raspberry Pi ist dafür also optimal geeignet. In diesem Tutorial bauen wir mittels einer einfachen Kamera unseren eigenen Raspberry Pi Barcode Scanner, der ebenfalls QR Codes lesen kann. Hierfür nutzen wir unter anderem OpenCV.
Die daraus gewonnene Funktionalität kann in verschiedenen Projekten verwendet werden. So können QR / Barcodes z.B. zur Identifikation genutzt werden, oder bspw. eine eigene Raspberry Pi Lagerverwaltung damit aufgebaut werden.
Barcodes / QR Codes sind ein- bzw. zweidimensionale Codes, in denen Textinformationen in Form von Bits gespeichert werden. Um diese anschließend zu entziffern, wird ein QR / Barcode Lesegerät benötigt. Dies besteht aus einer Kamera (dem Scanner), welche ein Bild des Codes macht und anschließend von einem PC / Mikrocontroller umgewandelt wird. Der Vorteil des QR Codes ist dabei, dass auch teilweise falsch gelesene Informationen (Bits) mittels Prüfsummen „repariert“ werden können und somit das Ergebnis trotzdem richtig ausgelesen wird.
Zubehör für den Raspberry Pi Barcode Scanner
In diesem Tutorial wird folgendes Zubehör verwendet:
- Raspberry Pi
- entsprechendes Zubehör (Micro SD Karte, Stromversorgung)
- Raspberry Pi Kamera
- alternativ: USB Webcam (gute Auflösung vorausgesetzt)
- ggf. ausgedruckten QR / Barcode, der gescannt wird.
- optional: Touchscreen
Des weiteren werden wir Python Codeschnipsel nutzen. Es empfiehlt sich also, wenn du bereits grundlegende Python Programmierkenntnisse hast. Falls du neu einsteigst oder deine Kenntnisse auffrischen willst, gibt es hier ein gutes Tutorial zum Einstieg.
Vorbereitung: Benötigte Tools zum Lesen von QR / Barcodes
Zunächst einmal benötigen wir eine Linux Distribution als Betriebssystem des Raspberry Pi’s. Hierbei bietet sich vor allem Raspbian oder ein darauf basierendes Betriebssystem (OpenHAB, KODI, OpenELEC, etc.) an. Falls du noch kein Betriebssystem auf deiner Micro SD Karte installiert hast, so findest du hier eine kurze Anleitung, wie du das Betriebssystem auf eine SD Karte flashst.
Wir loggen uns nun z.B. per SSH ein und installieren die nötigen Tools (unter Python 3):
sudo apt-get update sudo apt-get install python3 python3-pip libzbar0 sudo pip3 install opencv-python pyzbar imutils sudo apt-get install libcblas-dev libhdf5-dev libhdf5-serial-dev libatlas-base-dev libjasper-dev libqtgui4 libqt4-test
Die Installation sollte ohne weitere Fehler verlaufen.
Die Kamera kannst du auch bereits anschließen. Dabei spielt es keine Rolle, ob du eine offizielle Raspberry Pi Kamera nutzt, die über den CSI Anschluss direkt am Pi betrieben wird, oder eine Webcam über USB. Wichtig ist lediglich, dass die Webcam am Raspberry Pi und über OpenCV unterstützt wird. Bei aktuellen Kameras ist dies jedoch fast immer der Fall.
Erster Test: Mit dem Raspberry Pi QR / Barcodes lesen
Nun wollen wir auf einem einfachen Bild unsere QR und Barcodes mittels zbar erkennen und in lesbaren Text umwandeln. Dafür benötigen wir eine Datei eines solchen Codes.
Um schnell einen einfachen QR bzw. Barcode zu erstellen, gibt es dutzende Webseiten im Internet. Eine kurze Google Suche nach „Barcode Generator“ bzw. „QR Code Generator“ ergibt verschiedene Seiten. Ich habe hiermit bzw. hiermit folgenden Barcode und QR Code erstellt, welche „https://tutorials-raspberrypi.de/“ beinhalten.
Jetzt wollen wir einen oder beide dieser Codes lesen lassen. Dazu laden wir die Bilddateien zunächst auf dem Raspberry Pi herunter:
wget https://tutorials-raspberrypi.de/wp-content/uploads/barcode-tutorials-raspberrypi.de_.jpg wget https://tutorials-raspberrypi.de/wp-content/uploads/qr-code-tutorials-raspberrypi.de_.png
Nun erstellen wir eine neue Python Datei, in der wir den Code zum Auslesen der Bilder hinein kopieren:
sudo nano barcode-scanner.py
Folgenden Inhalt fügen wir ein (falls du eine andere Datei auslesen willst, kannst du den Namen und Pfad entsprechend in Zeile 6 anpassen):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# import packages import cv2 from pyzbar import pyzbar # define path path = "barcode-tutorials-raspberrypi.de_.jpg" # load image image = cv2.imread(path) # find QR and barcodes within the image barcodes = pyzbar.decode(image) for barcode in barcodes: print(barcode.data) |
Zunächst importieren wir die benötigten Pakete. In Zeile 11 lesen wir alle QR und Barcodes aus dem Bild aus – hierbei bekommen wir ein Array zurück, das folgende Werte beinhaltet:
- data: Der dekodierte Text, welcher sich durch den Code repräsentiert wurde.
- type: Der Typ des Codes (z.B. CODE128 oder QRCODE).
- rect: Ein Objekt, welches die Koordinaten des Punkt oben links (left + top) und die Breite/Höhe (width/height) angeben.
- polygon: Array an Punkten (mit x und y-Wert), die das Polygon kennzeichnen, in dem der Code enthalten ist.
Speichere das Skript (STRG + O), schließe die Datei (STRG + X) und führe sie aus (Abbrechen mit STRG+C):
sudo python3 barcode-scanner.py
Insgesamt sehen die Daten meines Bildes so aus:
Decoded(data=b'https://tutorials-raspberrypi.de/', type='CODE128', rect=Rect(left=4, top=0, width=786, height=75), polygon=[Point(x=4, y=1), Point(x=4, y=75), Point(x=790,y=74), Point(x=790, y=0)])
Für den Anfang nicht schlecht, oder?
Raspberry Pi Barcode Scanner: Einbinden des Kamera-Streams
Wir haben bisher gesehen, dass das Auslesen von Barcodes mittels Raspberry Pi sehr einfach ist! Was uns jetzt noch fehlt, ist dies live (in Echtzeit) per Kamera Stream / Videoauszulesen. Dadurch können wir direkt reagieren, wenn ein bestimmter Code vor die Kamera gehalten wird. Dazu kommt, dass Echtzeit-Bilder nicht immer den perfekten Winkel etc. haben.
Sofern du eine offizielle Raspberry Pi Kamer nutzt, muss diese erst aktiviert werden. Wir rufen dafür folgenden Befehl auf:
sudo raspi-config
Unter Interfacing Options -> Camera lässt sie sich aktivieren. Danach muss neu gestartet werden.
Wir erstellen nun eine weitere neue Datei:
sudo python3 barcode-scanner-live.py
Ähnlich zur vorherigen Datei, bekommt diese folgenden Inhalt (falls du keine Raspberry Pi Kamera verwendest, so kannst du in Zeile 9 usePiCamera = False
setzen):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# import packages import cv2 from pyzbar import pyzbar import imutils from imutils.video import VideoStream import time # initialize video stream and wait vs = VideoStream( usePiCamera = True ).start() time.sleep(2.0) # loop over frames while True: frame = vs.read() # for better performance, resize the image frame = imutils.resize(frame, width=400) # find and decode all barcodes in this frame barcodes = pyzbar.decode(frame) for barcode in barcodes: # do anything with that data print( barcode.data.decode("utf-8") ) |
Nachdem speichern und schließen (Strg+O, Strg+X) starten wir auch diese Datei:
sudo python3 barcode-scanner-live.py
Lasse nun die Kamera z.B. auf deinen Bildschirm oder auf einen ausgedruckten QR Code zeigen. Der dechiffrierte Text wird sofort angezeigt.
In diesem Beispiel geben wir den Text einfach nur aus, was relativ unspektakulär ist. Hier ist nun deine Kreativität gefragt, was damit angestellt werden soll. Ein paar Ideen wären folgende:
- Öffne ein Schloss beim Zeigen eines bestimmten Codes (mittels Relais)
- Jeder Nutzer bekommt einen Code, mit dem er sich authentifizieren kann. Beim Scannen des QR Codes werden seine Daten nach einer Datenbankanfrage angezeigt.
- Markiere Objekte anhand Codes und lasse diese vom Raspberry Pi erkennen.
- Füttere deinen Twitter Bot.
- Frage Produktdetails mittels Barcode-Datenbanken ab.
- Versende Mails.
- Lagerverwaltung: Speichere Informationen zur Lagerung eines Produkts mittels des Barcodes – so findest du es einfacher wieder.
Gerne kannst du weitere Ideen (idealerweise mit Skripten) in den Kommentaren posten.
Barcode Scanner Fazit
Der Raspberry Pi ist hervorragend als Barcode Scanner geeignet. Mittels Bibliotheken wie zlib und OpenCV lässt sich in nur wenigen Minuten ein kompletter Raspberry Pi Barcode Scanner selber bauen. Das Auslesen eines QR bzw. Barcodes kann in vielen anderen Projekten zum Einsatz kommen. Die möglichen Einsatzorte sind groß.
Außerdem ist unser Scanner enorm schnell. Das ermöglicht einen Betrieb in Echtzeit. Dazu haben wir gesehen, dass wir sowohl einzelne Bilder, als auch Videostreams mittels Python verarbeiten können.
18 Kommentare
Dank dafür, ist sehr gut an zu wenden für usere mäh robotter
auf einem neuen 2019-06-20-raspian-buster.img führe ich den Befehl „sudo pip3 install opencv-python pyzbar imutils“ aus und erhalte „Could not find a version that satisfies the requirement opencv-python (from versions: )
No matching distribution found for opencv-python“
Was muss ich tun?
Hallo,
Super Erklärung und genau das was ich suche. Ich habe gerade ein Projekt laufen (allerdings in der Windows-Welt) bei dem diese Anleitung mir weiterhelfen könnte. Allerdings bräuchte ich die Ausgabe des Barcodewertes als „Tastatureingabe“ für den PC. Gibt es eine Möglichkeit den Raspberry quasi als HID für einen Windows-PC zu nutzen? Der sich vielleicht nicht direkt erschließende Sinn hinter der Frage ist folgender. Ich nutze für ein bestehendes Erfassungstool aktuell Barcodescanner (Bluetooth und kabelgebunden). Der Wunsch ist nun quasi wie eine Supermarktkasse einen fest installierten Scanner zu nutzen, der einfach den Barcodewert an den PC übermittelt. Dafür wäre das oben beschriebene Projekt super.
googel mal nach „inputstick“
Hallo, super Tutorial und genau das was ich gesucht habe.
Leider bekomme ich immer einen Fehler wenn ich die barcode-scanner.py ausprobieren will.
Alles hat installiert was fehlt hier? Irgendwie bin ich ratlos. liblmath finde ich auch gar nicht im pip3
sudo python3 barcode-scanner.py
Traceback (most recent call last):
File „barcode-scanner.py“, line 2, in
import cv2
File „/usr/local/lib/python3.5/dist-packages/cv2/__init__.py“, line 3, in
from .cv2 import *
ImportError: libImath-2_2.so.12: cannot open shared object file: No such file or directory
Ich habe hier noch was dazu gefunden: https://github.com/Homebrew/homebrew-science/issues/2209 das könnte auf ein Problem im opencv hindeuten.
Welche Versionen hast du eigentlich per pip installiert?
Hallo, es geht noch weiter:
https://github.com/EdjeElectronics/TensorFlow-Object-Detection-on-the-Raspberry-Pi/issues/18
Wenn ich die Pakete nachziehe geht zwar der eine Error kommt aber ein anderer:
sudo aptitude install libilmbase-dev
sudo aptitude install libopenexr-dev
sudo aptitude install libgstreamer1.0-dev
python3.5
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
[GCC 6.3.0 20170516] on linux
Type „help“, „copyright“, „credits“ or „license“ for more information.
>>> import cv2
ImportError: numpy.core.multiarray failed to import
Traceback (most recent call last):
File „“, line 1, in
File „/usr/local/lib/python3.5/dist-packages/cv2/__init__.py“, line 3, in
from .cv2 import *
ImportError: numpy.core.multiarray failed to import
Kann das jemand nachvollziehen, oder hat den selben Fehler /das gleiche Problem?
So Leute ich habs:
https://jaredrhodes.com/2019/07/22/numpy-core-_multiarray_umath-cpython-35m-arm-linux-gnueabihf-so-undefined-symbol-cblas_sgemm-raspberry-pi/
Also alles raus und das raspi-numpy installiert
sudo pip3 uninstall numpy
sudo apt-get install python3-numpy
dann funktionierts:
sudo python3 barcode-scanner.py
b’https://tutorials-raspberrypi.de/‘
Hier noch der Rest der zum Stream scannen benötigt wird.
https://cvisiondemy.com/barcode-reader-with-python-opencv-and-pyzbar/
Die DISPLAY Variable lenkt man vorher auf den eigenen Rechner um (xhost +) nicht vergessen und dann öffnet (wenn man keine Oberfläche auf dem pi hat) ein lokales xwindows Fenster und ich seh direkt den Code der gescannt wird.
Wie hast du das implementiert?! Kannst du mir bitte auf die Sprünge helfen.
Bei mir kommt bei
„sudo pip3 install opencv-python pyzbar imutils“ folgendes: „sudo: pip3: Befehl nicht gefunden“
Was kann ich tun?
sudo apt-get update
sudo apt-get -y install python3-pip
Beim ersten Test mit den Matrizen wird mir nur folgendes ausgegeben:
b’https://tutorials-raspberrypi.de/‘
was kann ich machen, damit mir der decodierte Text angezeigt wird?
Hallo, ich suche eine Anwendung, die einfach nur die bewegten Bilder einer (USB-) Kamera auf dem Bildschirm anzeigt. Kann jemand helfen? Vielen Dank im Voraus
Hi,
Ich möchte bei mir ein simples Lagerverwaltungssystem aufbauen. Finde aber kein gutes Turtorial dazu (habe noch keine grossen Erfahrungen mit Raspberry). Kann mir da jemand weiterhelfen?
Es geht mir rein um das anlegen der Datenbank, sowie deren Verwaltung. Das Scannen der Produkte wurde hier ja bestens erklärt 🙂
You will need to start like this:
LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1.2.0 thonny
To not run into issues with import cv2 and the error undefined symbol: __atomic_fetch_add_8
I did try to compile from opencv both ways, but with no luck to get it working.
Wäre es vielleicht möglich mal konkret dieses Tutorial zu aktualisieren , irgendwie komme ich auf keinen Nenner . Vielen Dank wenn sich dies jemand annehmen würde.
Auch nach Neuinstallation von Numby kommt immer noch der gleiche Fehler.
sudo python3 barcode-scanner.py
Traceback (most recent call last):
File „barcode-scanner.py“, line 2, in
import cv2
File „/usr/local/lib/python3.7/dist-packages/cv2/__init__.py“, line 5, in
from .cv2 import *
ImportError: libgtk-3.so.0: cannot open shared object file: No such file or directory
Kann mir da bitte einer helfen?
Hallo,
ich versuche mich zur Zeit an dem Code oben mit Einbindung der Kamera. Ich habe die oben genannten Installationen durchgeführt, bekomme jedoch bei folgender Installation diese Meldung:
sudo apt-get install libcblas-dev libhdf5-dev libhdf5-serial-dev libatlas-base-dev libjasper-dev libqtgui4 libqt4-test
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen…. Fertig
Hinweis: »libhdf5-dev« wird an Stelle von »libhdf5-serial-dev« gewählt.
Paket libcblas-dev ist nicht verfügbar, wird aber von einem anderen Paket
referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
wurde oder nur aus einer anderen Quelle verfügbar ist.
Doch die folgenden Pakete ersetzen es:
libatlas-base-dev
E: Für Paket »libcblas-dev« existiert kein Installationskandidat.
Wenn ich nun einen QR-Code scanne erhalte ich nicht den gewünschten Output.
Liegt das an der Meldung oder hat das einen anderen Grund? Ich würde mich freuen, wenn mir wer weiterhelfen kann.
Danke im Voraus.
MfG
Lucas