TL; DR : Ich brauche eine Möglichkeit, einen QR-Code aus einer Bilddatei mit (vorzugsweise reinem) Python zu dekodieren.
Ich habe eine JPG-Datei mit einem QR-Code, den ich mit Python dekodieren möchte. Ich habe ein paar Bibliotheken gefunden, die behaupten, dies zu tun:
PyQRCode ( Website hier ), der angeblich qr-Codes aus Bildern dekodieren kann, indem einfach ein Pfad wie der folgende angegeben wird:
import sys, qrcode
d = qrcode.Decoder()
if d.decode('out.png'):
print 'result: ' + d.result
else:
print 'error: ' + d.error
Also habe ich es einfach mit installiert sudo pip install pyqrcode
. Das Seltsame an dem obigen Beispielcode ist jedoch, dass er nur importiert qrcode
(und nicht pyqrcode
). Da ich denke, dass er qrcode
sich auf diese Bibliothek bezieht, die nur QR-Code-Bilder erzeugen kann, hat mich das irgendwie verwirrt. Also habe ich den obigen Code mit beiden pyqrcode
und ausprobiert qrcode
, aber beide scheitern in der zweiten Zeile AttributeError: 'module' object has no attribute 'Decoder'
. Darüber hinaus verweist die Website auf Ubuntu 8.10 (das vor mehr als 6 Jahren veröffentlicht wurde) und ich kann kein öffentliches (git oder anderes) Repository finden, um das neueste Commit zu überprüfen. Also ging ich weiter zur nächsten Bibliothek:
ZBar ( Website hier ) behauptet zu sein "an open source software suite for reading bar codes from various sources, such as image files."
Also habe ich versucht, es unter Mac OSX zu installieren sudo pip install zbar
. Dies schlägt fehl mit error: command 'cc' failed with exit status 1
. Ich habe versucht, Vorschläge in den Antworten auf diese SO-Frage zu machen , aber ich kann sie scheinbar nicht lösen. Also beschloss ich, weiterzumachen:
QRTools , die laut diesem Blogpost Bilder mit dem folgenden Code einfach dekodieren können:
from qrtools import QR
myCode = QR(filename=u"/home/psutton/Documents/Python/qrcodes/qrcode.png")
if myCode.decode():
print myCode.data
print myCode.data_type
print myCode.data_to_string()
Also habe ich versucht, es mit zu installieren sudo pip install qrtools
, was nichts finden kann. Ich versuchte es auch mit python-qrtools
, qr-tools
, python-qrtools
und ein paar mehr Kombinationen, aber leider ohne Erfolg. Ich nehme an, es bezieht sich auf dieses Repo, das besagt, dass es auf ZBar basiert (siehe oben). Obwohl ich meinen Code auf Heroku ausführen möchte (und daher eine reine Python-Lösung bevorzuge), habe ich ihn erfolgreich auf einer Linux-Box (mit sudo apt-get install python-qrtools
) installiert und versucht, ihn auszuführen :
from qrtools import QR
c = QR(filename='/home/kramer65/qrcode.jpg')
c.data # prints u'NULL'
c.data_type # prints u'text'
c.data_to_string() # prints '\xef\xbb\xbfNULL' where I expect an int (being `1234567890`)
Obwohl dies zu entschlüsseln scheint, scheint es es nicht richtig zu machen. Es braucht außerdem ZBar und ist somit kein reines Python. Also beschloss ich, noch eine Bibliothek zu finden.
PyXing ( Website hier ) ist angeblich ein Python-Port der beliebten Java ZXing-Bibliothek , aber das anfängliche und einzige Commit ist 6 Jahre alt und das Projekt hat keinerlei Readme oder Dokumentation.
Für den Rest fand ich ein paar QR- en - Codierer (nicht de Coder) und einige API - Endpunkte , die für Sie dekodieren kann. Da ich nicht möchte, dass dieser Dienst von anderen API-Endpunkten abhängig ist, möchte ich die Dekodierung jedoch lokal halten.
Also zum Schluss; Würde jemand wissen, wie ich QR-Codes aus Bildern in (vorzugsweise reinem) Python dekodieren kann? Alle Tipps sind willkommen!
zbar
mit zu stellenpip
: stackoverflow.com/questions/27406641/…Antworten:
Sie können die folgenden Schritte und den folgenden Code ausführen
qrtools
:Erstellen Sie eine
qrcode
Datei, falls noch nicht vorhandenpyqrcode
, was mit installiert werden kannpip install pyqrcode
Und dann benutze den Code:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)
Dekodieren Sie eine vorhandene
qrcode
Datei mitqrtools
qrtools
mitsudo apt-get install python-qrtools
Verwenden Sie nun den folgenden Code in Ihrer Python-Eingabeaufforderung
>>> import qrtools >>> qr = qrtools.QR() >>> qr.decode("horn.png") >>> print qr.data u'HORN O.K. PLEASE.'
Hier ist der vollständige Code in einem einzigen Lauf:
In [2]: import pyqrcode In [3]: qr = pyqrcode.create("HORN O.K. PLEASE.") In [4]: qr.png("horn.png", scale=6) In [5]: import qrtools In [6]: qr = qrtools.QR() In [7]: qr.decode("horn.png") Out[7]: True In [8]: print qr.data HORN O.K. PLEASE.
Vorsichtsmaßnahmen
PyPNG
using verwenden,pip install pypng
um verwenden zu könnenpyqrcode
Falls Sie
PIL
installiert haben, erhalten Sie möglicherweiseIOError: decoder zip not available
. Versuchen SiePIL
in diesem Fall, Folgendes zu deinstallieren und neu zu installieren :Wenn das nicht funktioniert, versuchen Sie es
Pillow
stattdessenquelle
from qrtools import qrtools
Der folgende Code funktioniert gut mit mir:
Für die Erstellung von QR-Codebildern:
import pyqrcode qr = pyqrcode.create("test1") qr.png("test1.png", scale=6)
Für die QR-Code-Decodierung:
from PIL import Image from pyzbar.pyzbar import decode data = decode(Image.open('test1.png')) print(data)
das druckt das Ergebnis:
[Decoded(data=b'test1', type='QRCODE', rect=Rect(left=24, top=24, width=126, height=126), polygon=[Point(x=24, y=24), Point(x=24, y=150), Point(x=150, y=150), Point(x=150, y=24)])]
quelle
Ich beantworte nur den Teil der Frage zur
zbar
Installation.Ich habe
fast eine halbe Stunde undein paar Stunden damit verbracht, dass es unter Windows + Python 2.7 64-Bit funktioniert. Hier sind zusätzliche Hinweise zur akzeptierten Antwort:Laden Sie https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_amd64.whl herunter
Installieren Sie es mit
pip install zbar-0.10-cp27-none-win_amd64.whl
Wenn Python meldet ein ,
ImportError: DLL load failed: The specified module could not be found.
wenn tunimport zbar
, dann werden Sie nur das installieren müssen Visual C ++ Redistributable Packages für VS 2013 (Ich verbrachte hier viel Zeit und versuchte erfolglos neu zu kompilieren ...)Erforderlich auch: libzbar64-0.dll muss sich in einem Ordner befinden, der sich im PATH befindet. In meinem Fall habe ich es nach "C: \ Python27 \ libzbar64-0.dll" kopiert (was sich im PATH befindet). Wenn es immer noch nicht funktioniert, fügen Sie Folgendes hinzu:
import os os.environ['PATH'] += ';C:\\Python27' import zbar
PS: So dass es mit Python 3.x arbeiten , ist noch schwieriger: Compile zbar für Python 3.x .
PS2: Ich habe gerade pyzbar mit getestet
pip install pyzbar
und es ist VIEL einfacher, es funktioniert sofort (das einzige, was Sie brauchen, um VC Redist 2013-Dateien zu installieren). Es wird auch empfohlen, diese Bibliothek in diesem Artikel von pyimagesearch.com zu verwenden .quelle
Es gibt eine Bibliothek namens BoofCV, die behauptet, besser zu sein als ZBar und andere Bibliotheken .
Hier sind die Schritte, um dies zu verwenden (jedes Betriebssystem).
Voraussetzungen:
pip install pyboof
Zu dekodierende Klasse:
import os import numpy as np import pyboof as pb pb.init_memmap() #Optional class QR_Extractor: # Src: github.com/lessthanoptimal/PyBoof/blob/master/examples/qrcode_detect.py def __init__(self): self.detector = pb.FactoryFiducial(np.uint8).qrcode() def extract(self, img_path): if not os.path.isfile(img_path): print('File not found:', img_path) return None image = pb.load_single_band(img_path, np.uint8) self.detector.detect(image) qr_codes = [] for qr in self.detector.detections: qr_codes.append({ 'text': qr.message, 'points': qr.bounds.convert_tuple() }) return qr_codes
Verwendung:
qr_scanner = QR_Extractor() output = qr_scanner.extract('Your-Image.jpg') print(output)
Getestet und funktioniert unter Python 3.8 (Windows & Ubuntu)
quelle
Für Windows mit
ZBar
Voraussetzungen:
choco install zbar
pip install pyzbar
So dekodieren Sie:
from PIL import Image from pyzbar import pyzbar img = Image.open('My-Image.jpg') output = pyzbar.decode(img) print(output)
Alternativ können Sie es auch versuchen,
ZBarLight
indem Sie es wie hier beschrieben einrichten:https://pypi.org/project/zbarlight/
quelle