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 pyqrcode
aunque). Como creo que se qrcode
refiere 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 pyqrcode
y 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-qrtools
y 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!
zbar
conpip
: stackoverflow.com/questions/27406641/…Respuestas:
Puede probar los siguientes pasos y código usando
qrtools
:Cree un
qrcode
archivo, si aún no existepyqrcode
hacer esto, que se puede instalar usandopip install pyqrcode
Y luego usa el código:
>>> import pyqrcode >>> qr = pyqrcode.create("HORN O.K. PLEASE.") >>> qr.png("horn.png", scale=6)
Decodificar un
qrcode
archivo existente usandoqrtools
qrtools
usandosudo apt-get install python-qrtools
Ahora 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
PyPNG
usandopip install pypng
para usarpyqrcode
En caso de que lo haya
PIL
instalado, es posible que obtengaIOError: decoder zip not available
. En ese caso, intente desinstalar y reinstalarPIL
usando:Si eso no funciona, intente usar en su
Pillow
lugarfuente
from qrtools import qrtools
El 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
zbar
instalació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.whl
Si 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 zbar
PD: 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 pyzbar
y 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 pyboof
Clase 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_codes
Uso:
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
ZBar
Prerrequisitos:
choco install zbar
pip install pyzbar
Para 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
ZBarLight
configurándolo como se menciona aquí:https://pypi.org/project/zbarlight/
fuente