Làm thế nào để giải mã một hình ảnh mã QR trong Python (tốt nhất là nguyên chất)?


86

TL; DR : Tôi cần một cách để giải mã mã QR từ tệp hình ảnh bằng Python (tốt hơn là nguyên chất).

Tôi có một tệp jpg có mã QR mà tôi muốn giải mã bằng Python. Tôi đã tìm thấy một vài thư viện yêu cầu thực hiện điều này:

PyQRCode ( trang web tại đây ) được cho là có thể giải mã mã qr từ hình ảnh bằng cách chỉ cần cung cấp một đường dẫn như sau:

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

Vì vậy, tôi chỉ cần cài đặt nó bằng cách sử dụng sudo pip install pyqrcode. Tuy nhiên, điều tôi thấy lạ về đoạn mã ví dụ trên là nó chỉ nhập khẩu qrcode(chứ không phải pyqrcodemặc dù vậy) Vì tôi nghĩ qrcodeđề cập đến thư viện này chỉ có thể tạo ra các hình ảnh mã qr, điều đó khiến tôi bối rối. Vì vậy, tôi đã thử mã ở trên với cả hai pyqrcodeqrcode, nhưng cả hai đều không thành công ở dòng thứ hai AttributeError: 'module' object has no attribute 'Decoder'. Hơn nữa, trang web đề cập đến Ubuntu 8.10 (ra mắt cách đây hơn 6 năm) và tôi không thể tìm thấy kho lưu trữ công khai (git hoặc khác) của nó để kiểm tra bản cam kết mới nhất. Vì vậy, tôi chuyển sang thư viện tiếp theo:

ZBar ( trang web ở đây ) tuyên bố là "an open source software suite for reading bar codes from various sources, such as image files."Vì vậy, tôi đã thử cài đặt nó trên Mac OSX đang chạy sudo pip install zbar. Điều này không thành công với error: command 'cc' failed with exit status 1. Tôi đã cố gắng đưa ra các gợi ý trong câu trả lời cho câu hỏi SO này , nhưng dường như tôi không thể giải được. Vì vậy, tôi quyết định tiếp tục một lần nữa:

QRTools , theo bài đăng trên blog này có thể giải mã hình ảnh dễ dàng bằng cách sử dụng mã sau:

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

Vì vậy, tôi đã thử cài đặt nó bằng cách sử dụng sudo pip install qrtools, mà không thể tìm thấy bất cứ điều gì. Tôi cũng đã thử nó với python-qrtools, qr-tools, python-qrtoolsvà nhiều hơn nữa một vài kết hợp, nhưng tiếc là không có kết quả. Tôi cho rằng nó đề cập đến repo này nói rằng nó dựa trên ZBar (xem ở trên). Mặc dù tôi muốn chạy mã của mình trên Heroku (và do đó thích giải pháp Python thuần túy hơn), tôi đã cài đặt thành công nó trên hộp Linux (có sudo apt-get install python-qrtools) và thử chạy nó:

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

Mặc dù điều này có vẻ như để giải mã nó, Nó dường như không làm điều đó một cách chính xác. Hơn nữa, nó cần ZBar và do đó không phải là Python thuần túy. Vì vậy, tôi quyết định tìm thêm một thư viện.

PyXing ( trang web ở đây ) được cho là một cổng Python của thư viện Java ZXing phổ biến , nhưng bản cam kết ban đầu và duy nhất đã được 6 năm và dự án không có readme hoặc tài liệu nào.

Đối với phần còn lại, tôi đã tìm thấy một vài mã qr- en (không phải de coder) và một số điểm cuối API có thể giải mã cho bạn. Vì tôi không thích dịch vụ này phụ thuộc vào các điểm cuối API khác nên tôi muốn giữ bản giải mã cục bộ.

Vì vậy, để kết luận; có ai biết cách tôi có thể giải mã mã QR từ hình ảnh trong Python (tốt hơn là thuần túy) không? Tất cả các mẹo đều được chào đón!


Nó nên là: 'nếu myCode.decode ( "/ home / kramer65 / qrcode.jpg")' và không 'QR (filename =' / home / kramer65 / qrcode.jpg ')'
Dmitry Chichkov

Tôi cảm thấy cần đề cập đến một câu hỏi tiếp theo do @ kramer65 đặt ra về việc cài đặt zbarvới pip: stackoverflow.com/questions/27406641/…
Ian

Câu trả lời:


108

Bạn có thể thử các bước sau và mã bằng cách sử dụng qrtools:

  • Tạo một qrcodetệp, nếu chưa có

    • Tôi đã sử dụng pyqrcodeđể làm điều này, có thể được cài đặt bằngpip install pyqrcode
    • Và sau đó sử dụng mã:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Giải mã một qrcodetệp hiện có bằng cách sử dụngqrtools

    • Cài đặt qrtoolsbằng cách sử dụngsudo apt-get install python-qrtools
    • Bây giờ sử dụng mã sau trong lời nhắc python của bạn

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

Đây là mã hoàn chỉnh trong một lần chạy:

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.

Cảnh báo

  • Bạn có thể cần cài đặt PyPNGbằng pip install pypngcách sử dụngpyqrcode
  • Trong trường hợp bạn đã PILcài đặt, bạn có thể nhận được IOError: decoder zip not available. Trong trường hợp đó, hãy thử gỡ cài đặt và cài đặt lạiPIL bằng:

    pip uninstall PIL
    pip install PIL
    
  • Nếu điều đó không hiệu quả, hãy thử sử dụng Pillowthay thế

    pip uninstall PIL
    pip install pillow
    

1
Hi mu 無, cảm ơn câu trả lời của bạn. Mặc dù qrtools yêu cầu zbar và do đó không phải là python thuần túy, nhưng nó thực sự hoạt động ngay bây giờ. Vấn đề chính bây giờ là tôi cần cài đặt ràng buộc python zbar trên heroku, về vấn đề mà tôi đã đặt câu hỏi ở đây: stackoverflow.com/questions/27406641/… . Tôi sẽ chấp nhận câu trả lời của bạn, nhưng tôi sẽ đánh giá rất cao nếu bạn cũng xem câu hỏi khác của tôi để tôi có thể giải quyết việc chạy qrtools trên heroku. Cảm ơn rất nhiều!
kramer65

3
Điều này không hoạt động, đưa ra Exception: tostring () đã bị loại bỏ.
Bhishan Poudel

2
@BhishanPoudel Tôi cũng gặp phải điều này. Có vẻ như lỗi đã được sửa và sẽ xuất hiện trong bản phát hành tiếp theo. Đối với bất kỳ ai gặp phải vấn đề này, bạn có thể chỉnh sửa dòng 181 của /usr/lib/python2.7/dist-packages/qrtools.py (vị trí có thể thay đổi) và thay thế "tostring" bằng "tobytes". Nó đang chạy tốt cho tôi bây giờ.
jonthalpy

5
không làm việc. AttributeError: module 'qrtools' không có thuộc tính 'QR'
Saeed Mohtasham

1
@SaeedMohtasham thửfrom qrtools import qrtools
Krenair

9

Mã sau hoạt động tốt với tôi:

brew install zbar
pip install pyqrcode
pip install pyzbar

Để tạo hình ảnh mã QR:

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

Để giải mã mã QR:

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

in ra kết quả:

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

cho các giải pháp trên để làm việc, u cũng cần phải chạy pip cài đặt pypng && pip cài đặt hình ảnh
asad_hussain

6

Tôi chỉ trả lời một phần của câu hỏi về zbarcài đặt.

Tôi đã dành gần nửa giờ trong vài giờ để làm cho nó hoạt động trên Windows + Python 2.7 64-bit, vì vậy đây là các ghi chú bổ sung cho câu trả lời được chấp nhận:

  • Tải xuống https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_amd64.whl

  • Cài đặt nó với pip install zbar-0.10-cp27-none-win_amd64.whl

  • Nếu Python báo cáo ImportError: DLL load failed: The specified module could not be found.khi thực hiện import zbar, thì bạn sẽ chỉ cần cài đặt Visual C ++ Redistributable Packages cho VS 2013 (Tôi đã dành rất nhiều thời gian ở đây, cố gắng biên dịch lại không thành công ...)

  • Cũng bắt buộc: libzbar64-0.dll phải nằm trong một thư mục nằm trong PATH. Trong trường hợp của tôi, tôi đã sao chép nó vào "C: \ Python27 \ libzbar64-0.dll" (nằm trong PATH). Nếu nó vẫn không hoạt động, hãy thêm cái này:

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

PS: Làm cho nó làm việc với Python 3.x thậm chí còn khó khăn hơn: Compile ZBar cho Python 3.x .

PS2: Tôi vừa thử nghiệm với pyzbarpip install pyzbar và nó dễ dàng hơn RẤT NHIỀU, nó hoạt động hiệu quả (điều duy nhất là bạn cần cài đặt các tệp VC Redist 2013). Bạn cũng nên sử dụng thư viện này trong bài viết pyimagesearch.com này .


0

Có một thư viện tên là BoofCV được cho là tốt hơn ZBar và các thư viện khác .
Dưới đây là các bước để sử dụng nó (bất kỳ hệ điều hành nào).

Điều kiện tiên quyết:

  • Đảm bảo JDK 14+ được cài đặt và đặt trong $ PATH
  • pip install pyboof

Lớp để giải mã:

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

Sử dụng:

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

Đã thử nghiệm và hoạt động trên Python 3.8 (Windows và Ubuntu)


0

Đối với Windows sử dụng ZBar

Điều kiện tiên quyết:

  • Cài đặt ZBar bằng cách:
  • pip install pyzbar

Để giải mã:

from PIL import Image
from pyzbar import pyzbar

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

Ngoài ra, bạn cũng có thể thử sử dụng bằng ZBarLightcách thiết lập nó như được đề cập tại đây:
https://pypi.org/project/zbarlight/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.