Подтвердить что ты не робот

Как декодировать изображение QR-кода в (предпочтительно чистом) Python?

TL; DR: мне нужен способ декодирования QR-кода из файла изображения с использованием (предпочтительного чистого) Python.

У меня есть jpg файл с QR-кодом, который я хочу декодировать с помощью Python. Я нашел пару библиотек, которые заявляют об этом:

PyQRCode (здесь), который, предположительно, может декодировать qr-коды из изображений, просто предоставив такой путь:

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

Поэтому я просто установил его с помощью sudo pip install pyqrcode. Тем не менее, я обнаружил, что странный пример кода выше: он только импортирует qrcode (а не pyqrcode хотя). Поскольку я думаю, что qrcode относится к эту библиотеку, которая может генерировать только изображения qr-кода, которые меня путают. Поэтому я пробовал код выше с помощью pyqrcode и qrcode, но оба отказались во второй строке, говоря AttributeError: 'module' object has no attribute 'Decoder'. Кроме того, веб-сайт относится к Ubuntu 8.10 (который вышел более 6 лет назад), и я не могу найти публикацию (git или другое) хранилище для проверки последней фиксации. Поэтому я перешел к следующей библиотеке:

ZBar (сайт здесь) утверждает, что он "an open source software suite for reading bar codes from various sources, such as image files." Поэтому я попытался установить его на Mac OSX sudo pip install zbar. Это не выполняется с помощью error: command 'cc' failed with exit status 1. Я попробовал предложения в ответах на этот вопрос SO, но я не могу его решить. Поэтому я решил снова продолжить:

QRTools, который согласно этот blogpost может легко декодировать изображения, используя следующий код:

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

Поэтому я попытался установить его с помощью sudo pip install qrtools, который ничего не нашел. Я также попробовал его с python-qrtools, qr-tools, python-qrtools и еще несколькими комбинациями, но, к сожалению, безрезультатно. Я полагаю, что это относится к этому репо, в котором говорится, что он основан на ZBar (см. Выше). Хотя я хочу запустить свой код на Heroku (и, таким образом, предпочитаю чистое решение Python), я успешно установил его в ящик Linux (с sudo apt-get install python-qrtools) и попытался запустить его:

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

Хотя это, кажется, расшифровывает его, похоже, что это не так. Кроме того, он нуждается в ZBar и, следовательно, не является чистым Python. Поэтому я решил найти еще одну библиотеку.

PyXing (сайт здесь) предположительно является портом Python популярной Java библиотека ZXing, но первоначальная и единственная фиксация - 6 лет, а проект не имеет никакого файла readme или документации.

В остальном я нашел пару кодов qr- ru (не de) и некоторые конечные точки API, которые могут декодироваться для вас. Поскольку мне не нравится, что эта служба зависит от других конечных точек API, я бы хотел сохранить локальное декодирование.

Итак, чтобы заключить; Кто-нибудь знает, как я могу декодировать QR-коды из изображений в (предпочтительном чистом) Python? Все советы приветствуются!

4b9b3361

Ответ 1

Вы можете попробовать следующие шаги и код, используя qrtools:

  • Создайте файл qrcode, если он еще не существует

    • Для этого я использовал pyqrcode, который можно установить с помощью pip install pyqrcode
    • И затем используйте код:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Декодировать существующий файл qrcode, используя qrtools

    • Установите qrtools с помощью sudo apt-get install python-qrtools
    • Теперь используйте следующий код в командной строке python

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

Вот полный код за один проход:

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.

Предостережение

  • Возможно, вам потребуется установить PyPNG с помощью pip install pypng для использования pyqrcode
  • Если вы установили PIL, вы можете получить IOError: decoder zip not available. В этом случае попробуйте удалить и переустановить PIL, используя:

    pip uninstall PIL
    pip install PIL
    
  • Если это не сработает, попробуйте вместо этого использовать Pillow

    pip uninstall PIL
    pip install pillow
    

Ответ 2

Я потратил почти полчаса, чтобы он работал на Windows + Python 2.7 64-bit, поэтому здесь приведены дополнительные примечания к принятому ответу:

и код из основного ответа должен работать:

import pyqrcode
qr = pyqrcode.create("HORN O.K. PLEASE.")
qr.png("horn.png", scale=6)
import qrtools
qr = qrtools.QR()
qr.decode("horn.png")
print qr.data