Як декодувати зображення QR-коду в (бажано чистому) Python?


86

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. Я намагався дати пропозиції у відповідях на це ТАКЕ питання , але, здається, не можу це вирішити. Тому я вирішив рухатися далі:

QRTools , які згідно з цим блогом можуть легко декодувати зображення, використовуючи такий код:

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- ан кодеров (НЕ де - кодеров) і деякі API кінцевих точок , які можуть розшифрувати для вас. Оскільки мені не подобається, щоб ця служба залежала від інших кінцевих точок API, я хотів би продовжувати декодування локальним.

Отже, на закінчення; хтось знає, як я можу декодувати QR-коди із зображень у (бажано чистому) Python? Всі поради вітаються!


Це має бути: 'if myCode.decode ("/ home / kramer65 / qrcode.jpg")', а не 'QR (filename =' / home / kramer65 / qrcode.jpg ')'
Дмитро Чичков

Я відчуваю, що варто згадати наступне запитання, поставлене @ kramer65 щодо встановлення за zbarдопомогою pip: stackoverflow.com/questions/27406641/…
Ян

Відповіді:


108

Ви можете спробувати наступні кроки та код, використовуючи 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
    

1
Привіт mu 無, дякую за вашу відповідь. Хоча qrtools вимагає zbar і, отже, не є чистим пітоном, він справді працює зараз. Зараз основною проблемою є те, що мені потрібно встановити прив’язку python zbar на heroku, про що я тут поставив запитання: stackoverflow.com/questions/27406641/… . Я прийму вашу відповідь, але я був би дуже вдячний, якщо б ви також подивились інше моє запитання, щоб я міг вирішити запуск qrtools на heroku. Завдяки мільйонів!
kramer65

3
Це не працює, дає виняток: tostring () видалено.
Bhishan Poudel

2
@BhishanPoudel Я теж зіткнувся з цим. Здається, помилка виправлена ​​і повинна з’явитися в наступному випуску. Для всіх, хто стикається з цим, ви можете відредагувати рядок 181 з /usr/lib/python2.7/dist-packages/qrtools.py (розташування може відрізнятися) і замінити "tostring" на "tobytes". Зараз у мене це гарно працює.
jonthalpy

5
не працює. AttributeError: модуль 'qrtools' не має атрибута 'QR'
Saeed Mohtasham

1
@SaeedMohtasham tryfrom qrtools import qrtools
Krenair

9

Наступний код добре працює зі мною:

brew install zbar
pip install pyqrcode
pip install pyzbar

Для створення зображення QR-коду:

import pyqrcode
qr = pyqrcode.create("test1")
qr.png("test1.png", scale=6)

Для декодування QR-коду:

from PIL import Image
from pyzbar.pyzbar import decode
data = decode(Image.open('test1.png'))
print(data)

що друкує результат:

[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)])]

щоб вищезгадане рішення працювало, вам також потрібно запустити pip install pypng && pip install image
asad_hussain

6

Я відповідаю лише на частину питання про zbarвстановлення.

Я витратив майже півгодини кілька годин, щоб змусити його працювати на Windows + Python 2.7 64-bit, тому ось додаткові примітки до прийнятої відповіді:

  • Завантажте https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_amd64.whl

  • Встановіть його за допомогою pip install zbar-0.10-cp27-none-win_amd64.whl

  • Якщо Python повідомляє про те, ImportError: DLL load failed: The specified module could not be found.коли це робить import zbar, вам просто потрібно буде встановити пакунки Visual C ++ для розповсюдження для VS 2013 (я провів тут багато часу, намагаючись перекомпілювати невдало ...)

  • Потрібно також: libzbar64-0.dll повинен знаходитися в папці, яка знаходиться в PATH. У моєму випадку я скопіював його в "C: \ Python27 \ libzbar64-0.dll" (який знаходиться в PATH). Якщо це все ще не працює, додайте це:

    import os
    os.environ['PATH'] += ';C:\\Python27' 
    import zbar
    

PS: як змусити його працювати з Python 3.x ще складніше: Compile Zbar для Python 3.x .

PS2: Я просто перевіряв pyzbar з , pip install pyzbarі це набагато простіше, вона працює поза коробки (єдине, що вам потрібно мати VC REDIST 2013 файлів встановлений). Також рекомендується використовувати цю бібліотеку в цій статті pyimagesearch.com .


0

Існує бібліотека BoofCV, яка претендує на краще, ніж ZBar та інші бібліотеки .
Ось кроки для використання цього (будь-якої ОС).

Передумови:

  • Переконайтеся, що JDK 14+ встановлено та встановлено в $ PATH
  • pip install pyboof

Клас для декодування:

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

Використання:

qr_scanner = QR_Extractor()
output = qr_scanner.extract('Your-Image.jpg')
print(output)

Перевірено та працює на Python 3.8 (Windows та Ubuntu)


0

Для Windows, що використовує ZBar

Передумови:

Для декодування:

from PIL import Image
from pyzbar import pyzbar

img = Image.open('My-Image.jpg')
output = pyzbar.decode(img)
print(output)

Ви також можете спробувати використовувати ZBarLight, налаштувавши його, як згадано тут:
https://pypi.org/project/zbarlight/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.