2014-12-01 34 views
44

TL; DR: Ho bisogno di un modo per decodificare un codice QR da un file immagine usando (preferibilmente puro) Python.Come decodificare un'immagine QR-code in Python (preferibilmente puro)?

Ho un file jpg con un codice QR che voglio decodificare usando Python. Ho trovato un paio di librerie che pretendono di fare questo:

PyQRCode (website here) che presumibilmente in grado di decodificare i codici QR a partire da immagini, fornendo semplicemente un percorso come questo:

import sys, qrcode 
d = qrcode.Decoder() 
if d.decode('out.png'): 
    print 'result: ' + d.result 
else: 
    print 'error: ' + d.error 

Così ho installato semplicemente usando sudo pip install pyqrcode. La cosa che trovo strano nel codice di esempio sopra tuttavia, è che importa solo (e non) Dal momento che penso che si riferisca a this library che può solo generare qr-code images mi ha confuso. Così ho provato il codice sopra con entrambi pyqrcode e qrcode, ma entrambi falliscono alla seconda riga dicendo AttributeError: 'module' object has no attribute 'Decoder'. Inoltre, the website si riferisce a Ubuntu 8.10 (che è uscito più di 6 anni fa) e non riesco a trovare un repository pubblico (git o altro) per controllare l'ultimo commit. Così mi sono trasferito al prossimo libreria:

ZBar (website here) sostiene di essere "an open source software suite for reading bar codes from various sources, such as image files." così ho provato l'installazione su Mac OSX in esecuzione sudo pip install zbar. Questo fallisce con error: command 'cc' failed with exit status 1. Ho provato a suggerire le risposte a this SO question, ma non riesco a risolverlo. Così ho deciso di andare avanti ancora:

QRTools, che secondo this blogpost in grado di decodificare le immagini facilmente utilizzando il seguente codice:

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() 

Così ho provato a installare utilizzando sudo pip install qrtools, che non riesce a trovare nulla. Ho anche provato con python-qrtools, qr-tools, python-qrtools e un paio di altre combinazioni, ma purtroppo inutilmente. Suppongo che si riferisce a this repo che dice che è basato su ZBar (vedi sopra). Anche se ho voglia di correre il mio codice su Heroku (e quindi preferire una soluzione di Python puro) Ho installato con successo su una macchina Linux (con sudo apt-get install python-qrtools) e ha cercato di eseguirlo:

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`) 

Anche se questo sembra decodificarlo, E non sembra farlo correttamente. Ha inoltre bisogno di ZBar e quindi non è puro Python. Così ho deciso di trovare un'altra libreria.

PyXing (website here) è presumibilmente un porto Python del popolare Java ZXing library, ma l'iniziale e solo commettere è di 6 anni e il progetto non ha Leggimi o la documentazione di sorta.

Per il resto ho trovato un paio QR en codificatori (non de codificatori) e alcuni endpoint di API in grado di decodificare per voi. Dato che non mi piace che questo servizio dipenda da altri endpoint API, vorrei comunque mantenere la decodifica locale.

Quindi per concludere; qualcuno saprebbe come posso decodificare i codici QR dalle immagini in (preferibile puro) Python? Tutti i suggerimenti sono ben accetti!

+0

che dovrebbe essere: 'se myCode.decode ("/ home/kramer65 /qrcode.jpg ")" e non "QR (filename = '/ home/kramer65/qrcode.jpg') ' –

+0

Ritengo che valga la pena citare una domanda di follow-up posta da ** @ kramer65 ** sull'installazione' zbar' con 'pip': http://stackoverflow.com/questions/27406641/how-to-install-python-bindings-originating-from-an-a pt-package – Nez

risposta

64

È possibile provare i seguenti passaggi e il codice usando qrtools:

  • Creare un file qrcode, se non già esistente

    • ho usato pyqrcode per fare questo, che può essere installato utilizzando pip install pyqrcode
    • E quindi utilizzare il codice:

      >>> import pyqrcode 
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.") 
      >>> qr.png("horn.png", scale=6) 
      
  • decodificare un file esistente usando qrcodeqrtools

    • Installare qrtools utilizzando sudo apt-get install python-qrtools
    • Ora utilizzare il seguente codice all'interno della vostra pronta pitone

      >>> import qrtools 
      >>> qr = qrtools.QR() 
      >>> qr.decode("horn.png") 
      >>> print qr.data 
      u'HORN O.K. PLEASE.' 
      

Ecco il codice completo in un unico passaggio:

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. 

Avvertenze

  • Potrebbe essere necessario installare PyPNG utilizzando pip install pypng per l'utilizzo pyqrcode
  • Nel caso in cui hai installato PIL, potresti ottenere IOError: decoder zip not available. In questo caso, utilizzando try uninstalling and reinstalling PIL:

    pip uninstall PIL 
    pip install PIL 
    
  • Se questo non funziona, provare a utilizzare Pillow invece

    pip uninstall PIL 
    pip install pillow 
    
+1

Ciao mu 無, grazie per la tua risposta. Sebbene qrtools richieda zbar e quindi non sia puro python, funziona davvero ora. Il problema principale ora è che ho bisogno di installare il collegamento zbar python su heroku, sul quale ho posto una domanda qui: http://stackoverflow.com/questions/27406641/how-to-install-python-bindings-originating-from -an-apt-pacchetto. Accetterò la tua risposta, ma sarei molto grato se anche tu dia un'occhiata alla mia altra domanda in modo da poter risolvere i qrtools su heroku. Grazie mille! – kramer65

+0

@ kramer65 Sfortunatamente, non ho molta esperienza con heroku, quindi non sono sicuro di come siano installati i pacchetti lì ... –

+3

Questo non funziona, dà Eccezione: tostring() è stato rimosso. –