Wie dekodiere ich ein QR-Code-Bild in (vorzugsweise reinem) Python?

85

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 qrcodesich auf diese Bibliothek bezieht, die nur QR-Code-Bilder erzeugen kann, hat mich das irgendwie verwirrt. Also habe ich den obigen Code mit beiden pyqrcodeund 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-qrtoolsund 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!

kramer65
quelle
Es sollte sein: 'if myCode.decode ("/ home / kramer65 / qrcode.jpg")' und nicht 'QR (Dateiname =' / home / kramer65 / qrcode.jpg ')'
Dmitry Chichkov
Ich halte es für erwähnenswert, eine Folgefrage von @ kramer65 zur Installation zbarmit zu stellen pip: stackoverflow.com/questions/27406641/…
Ian

Antworten:

107

Sie können die folgenden Schritte und den folgenden Code ausführen qrtools:

  • Erstellen Sie eine qrcodeDatei, falls noch nicht vorhanden

    • Ich habe dafür verwendet pyqrcode, 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 qrcodeDatei mitqrtools

    • Installieren Sie qrtoolsmitsudo 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

  • Möglicherweise müssen Sie PyPNGusing verwenden, pip install pypngum verwenden zu könnenpyqrcode
  • Falls Sie PILinstalliert haben, erhalten Sie möglicherweise IOError: decoder zip not available. Versuchen SiePIL in diesem Fall, Folgendes zu deinstallieren und neu zu installieren :

    pip uninstall PIL
    pip install PIL
    
  • Wenn das nicht funktioniert, versuchen Sie es Pillowstattdessen

    pip uninstall PIL
    pip install pillow
    
mu 無
quelle
1
Hallo mu thanks, danke für deine Antwort. Obwohl qrtools zbar benötigt und somit kein reines Python ist, funktioniert es jetzt tatsächlich. Das Hauptproblem ist jetzt, dass ich die zbar-Python-Bindung auf heroku installieren muss, zu der ich hier eine Frage gestellt habe: stackoverflow.com/questions/27406641/… . Ich werde Ihre Antwort akzeptieren, aber ich würde mich sehr freuen, wenn Sie sich auch meine andere Frage ansehen, damit ich laufende qrtools auf Heroku lösen kann. Tausend Dank!
kramer65
3
Dies funktioniert nicht, gibt Ausnahme: tostring () wurde entfernt.
Bhishan Poudel
2
@BhishanPoudel Ich bin auch darauf gestoßen. Es scheint, dass der Fehler behoben wurde und in der nächsten Version erscheinen sollte. Wenn Sie darauf stoßen, können Sie die Zeile 181 von /usr/lib/python2.7/dist-packages/qrtools.py (Speicherort kann variieren) bearbeiten und "tostring" durch "tobytes" ersetzen. Es läuft jetzt gut für mich.
Jonthalpyie
5
funktioniert nicht. AttributeError: Modul 'qrtools' hat kein Attribut 'QR'
Saeed Mohtasham
1
@ SaeedMohtasham versuchenfrom qrtools import qrtools
Krenair
9

Der folgende Code funktioniert gut mit mir:

brew install zbar
pip install pyqrcode
pip install pyzbar

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)])]
Yuiq
quelle
Damit die oben genannte Lösung funktioniert, müssen Sie auch pip install pypng && pip install image
ausführen
6

Ich beantworte nur den Teil der Frage zur zbarInstallation.

Ich habe fast eine halbe Stunde und ein 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 tun import 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 pyzbarund 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 .

Basj
quelle
0

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:

  • Stellen Sie sicher, dass JDK 14+ installiert und in $ PATH festgelegt ist
  • 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)

Gokul NC
quelle
0

Für Windows mit ZBar

Voraussetzungen:

  • Installieren Sie ZBar wie folgt:
  • 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, ZBarLightindem Sie es wie hier beschrieben einrichten:
https://pypi.org/project/zbarlight/

Gokul NC
quelle