TL; DR : Necesito una forma de decodificar un código QR de un archivo de imagen usando Python (preferiblemente puro).
Tengo un archivo jpg con un código QR que quiero decodificar usando Python. Encontré un par de bibliotecas que afirman hacer esto:
PyQRCode ( sitio web aquí ) que supuestamente puede decodificar códigos qr a partir de imágenes simplemente proporcionando una ruta como esta:
import sys, qrcode
d = qrcode.Decoder()
if d.decode('out.png'):
print 'result: ' + d.result
else:
print 'error: ' + d.error
Así que simplemente lo instalé usando sudo pip install pyqrcode. Sin embargo, lo que encuentro extraño sobre el código de ejemplo anterior es que solo importa qrcode(y no pyqrcodeaunque). Como creo que se qrcoderefiere a esta biblioteca que solo puede generar imágenes de código qr, me confundió un poco. Así que probé el código anterior con ambos pyqrcodey qrcode, pero ambos fallaron en la segunda línea diciendo AttributeError: 'module' object has no attribute 'Decoder'. Además, el sitio web se refiere a Ubuntu 8.10 (que salió hace más de 6 años) y no puedo encontrar un repositorio público (git u otro) para verificar la última confirmación. Así que pasé a la siguiente biblioteca:
ZBar ( sitio web aquí ) afirma ser "an open source software suite for reading bar codes from various sources, such as image files."así que intenté instalarlo en Mac OSX en ejecución sudo pip install zbar. Esto falla con error: command 'cc' failed with exit status 1. Intenté sugerencias en las respuestas a esta pregunta SO , pero parece que no puedo resolverlo. Así que decidí seguir adelante de nuevo:
QRTools , que según esta publicación de blog puede decodificar imágenes fácilmente usando el siguiente código:
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()
Así que intenté instalarlo usando sudo pip install qrtools, que no puedo encontrar nada. También he probado con python-qrtools, qr-tools, python-qrtoolsy un par más combinaciones, pero lamentablemente sin éxito. Supongo que se refiere a este repositorio que dice que está basado en ZBar (ver arriba). Aunque quiero ejecutar mi código en Heroku (y por lo tanto prefiero una solución pura de Python), lo instalé con éxito en una caja de Linux (con sudo apt-get install python-qrtools) e intenté ejecutarlo:
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`)
Aunque esto parece decodificarlo, no parece hacerlo correctamente. Además, necesita ZBar y, por lo tanto, no es Python puro. Así que decidí buscar otra biblioteca.
PyXing ( sitio web aquí ) es supuestamente un puerto Python de la popular biblioteca Java ZXing , pero la confirmación inicial y única tiene 6 años y el proyecto no tiene ningún archivo Léame o documentación.
Para el resto He encontrado un par qr- ES codificadores (no de codificadores) y algunos puntos finales de API que puede decodificar para usted. Como no me gusta que este servicio dependa de otros puntos finales de API, me gustaría mantener la decodificación local.
Así que para concluir; ¿Alguien sabría cómo puedo decodificar códigos QR a partir de imágenes en Python (preferiblemente puro)? ¡Todos los consejos son bienvenidos!

zbarconpip: stackoverflow.com/questions/27406641/…Respuestas:
Puede probar los siguientes pasos y código usando
qrtools:Cree un
qrcodearchivo, si aún no existepyqrcodehacer esto, que se puede instalar usandopip install pyqrcodeY luego usa el código:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)Decodificar un
qrcodearchivo existente usandoqrtoolsqrtoolsusandosudo apt-get install python-qrtoolsAhora use el siguiente código dentro de su indicador de Python
>>> import qrtools >>> qr = qrtools.QR() >>> qr.decode("horn.png") >>> print qr.data u'HORN O.K. PLEASE.'Aquí está el código completo en una sola ejecución:
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.Advertencias
PyPNGusandopip install pypngpara usarpyqrcodeEn caso de que lo haya
PILinstalado, es posible que obtengaIOError: decoder zip not available. En ese caso, intente desinstalar y reinstalarPILusando:Si eso no funciona, intente usar en su
Pillowlugarfuente
from qrtools import qrtoolsEl siguiente código funciona bien conmigo:
Para la creación de imágenes de códigos QR:
import pyqrcode qr = pyqrcode.create("test1") qr.png("test1.png", scale=6)Para decodificación de códigos QR:
from PIL import Image from pyzbar.pyzbar import decode data = decode(Image.open('test1.png')) print(data)que imprime el resultado:
[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)])]fuente
Respondo solo una parte de la pregunta sobre la
zbarinstalación.Pasé
casi media horaunas pocas horas para que funcionara en Windows + Python 2.7 de 64 bits, por lo que aquí hay notas adicionales a la respuesta aceptada:Descarga https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_amd64.whl
Instalarlo con
pip install zbar-0.10-cp27-none-win_amd64.whlSi Python informa un
ImportError: DLL load failed: The specified module could not be found.cuándo hacerloimport zbar, entonces solo necesitará instalar los paquetes redistribuibles de Visual C ++ para VS 2013 (pasé mucho tiempo aquí, tratando de recompilar sin éxito ...)También es necesario: libzbar64-0.dll debe estar en una carpeta que se encuentre en la RUTA. En mi caso, lo copié en "C: \ Python27 \ libzbar64-0.dll" (que está en la RUTA). Si aún no funciona, agregue esto:
import os os.environ['PATH'] += ';C:\\Python27' import zbarPD: Hacer que funcione con Python 3.x es aún más difícil: compile zbar para Python 3.x .
PS2: Acabo de probar pyzbar con
pip install pyzbary es MUCHO más fácil, funciona de inmediato (lo único que necesita es tener instalados los archivos VC Redist 2013). También se recomienda utilizar esta biblioteca en este artículo de pyimagesearch.com .fuente
Hay una biblioteca llamada BoofCV que dice ser mejor que ZBar y otras bibliotecas .
Estos son los pasos para usar eso (cualquier sistema operativo).
Prerrequisitos:
pip install pyboofClase para decodificar:
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_codesUso:
qr_scanner = QR_Extractor() output = qr_scanner.extract('Your-Image.jpg') print(output)Probado y funciona en Python 3.8 (Windows y Ubuntu)
fuente
Para Windows usando
ZBarPrerrequisitos:
choco install zbarpip install pyzbarPara decodificar:
from PIL import Image from pyzbar import pyzbar img = Image.open('My-Image.jpg') output = pyzbar.decode(img) print(output)Alternativamente, también puede intentar usarlo
ZBarLightconfigurándolo como se menciona aquí:https://pypi.org/project/zbarlight/
fuente