Bagaimana cara memecahkan kode gambar kode QR di (sebaiknya murni) Python?


88

TL; DR : Saya membutuhkan cara untuk memecahkan kode QR-code dari file gambar menggunakan (lebih disukai murni) Python.

Saya punya file jpg dengan kode QR yang ingin saya dekode menggunakan Python. Saya telah menemukan beberapa perpustakaan yang mengklaim melakukan ini:

PyQRCode ( situs web di sini ) yang seharusnya dapat memecahkan kode kode qr dari gambar hanya dengan menyediakan jalur seperti ini:

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

Jadi saya hanya menginstalnya menggunakan sudo pip install pyqrcode. Hal yang saya anggap aneh tentang contoh kode di atas, bagaimanapun, adalah bahwa itu hanya impor qrcode(dan bukan pyqrcodemeskipun) Karena saya pikir qrcodemengacu pada pustaka ini yang hanya dapat menghasilkan gambar kode qr itu agak membingungkan saya. Jadi saya mencoba kode di atas dengan pyqrcodedan qrcode, tetapi keduanya gagal pada baris kedua yang mengatakan AttributeError: 'module' object has no attribute 'Decoder'. Selain itu, situs web mengacu pada Ubuntu 8.10 (yang keluar lebih dari 6 tahun yang lalu) dan saya tidak dapat menemukan repositori publik (git atau lainnya) untuk memeriksa komit terbaru. Jadi saya pindah ke perpustakaan berikutnya:

ZBar ( situs web di sini ) mengklaim sebagai "an open source software suite for reading bar codes from various sources, such as image files."Jadi saya mencoba menginstalnya di Mac OSX yang sedang berjalan sudo pip install zbar. Ini gagal dengan error: command 'cc' failed with exit status 1. Saya mencoba memberikan saran dalam jawaban atas pertanyaan SO ini , tetapi sepertinya saya tidak dapat menyelesaikannya. Jadi saya memutuskan untuk pindah lagi:

QRTools , yang menurut blogpost ini dapat mendekode gambar dengan mudah menggunakan kode berikut:

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

Jadi saya mencoba menginstalnya menggunakan sudo pip install qrtools, yang tidak dapat menemukan apa pun. Saya juga mencoba dengan python-qrtools, qr-tools, python-qrtoolsdan beberapa lebih kombinasi, tapi sayangnya tidak berhasil. Saya kira itu mengacu pada repo ini yang mengatakan itu didasarkan pada ZBar (lihat di atas). Meskipun saya ingin menjalankan kode saya di Heroku (dan dengan demikian lebih memilih solusi Python murni), saya berhasil menginstalnya di kotak Linux (dengan sudo apt-get install python-qrtools) dan mencoba menjalankannya:

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

Meskipun ini sepertinya memecahkan kodenya, Sepertinya ini tidak melakukannya dengan benar. Ini juga membutuhkan ZBar dan dengan demikian bukan Python murni. Jadi saya memutuskan untuk mencari perpustakaan lain.

PyXing ( situs web di sini ) seharusnya merupakan port Python dari pustaka Java ZXing yang populer , tetapi komit awal dan satu-satunya adalah 6 tahun dan proyek tersebut tidak memiliki readme atau dokumentasi sama sekali.

Selebihnya saya menemukan beberapa qr- en coders (tidak de coders) dan beberapa API endpoint yang dapat memecahkan kode untuk Anda. Karena saya tidak suka layanan ini bergantung pada endpoint API lain, saya ingin menjaga decoding tetap lokal.

Jadi untuk menyimpulkan; adakah yang tahu bagaimana saya bisa memecahkan kode QR-kode dari gambar di (lebih disukai murni) Python? Semua tips diterima!


Seharusnya: 'if myCode.decode ("/ home / kramer65 / qrcode.jpg")' dan bukan 'QR (filename =' / home / kramer65 / qrcode.jpg ')'
Dmitry Chichkov

Saya merasa perlu untuk menyebutkan pertanyaan tindak lanjut yang diajukan oleh @ kramer65 tentang pemasangan zbardengan pip: stackoverflow.com/questions/27406641/…
Ian

Jawaban:


109

Anda dapat mencoba langkah-langkah dan kode berikut menggunakan qrtools:

  • Buat qrcodefile, jika belum ada

    • Saya biasa pyqrcodemelakukan ini, yang dapat diinstal menggunakanpip install pyqrcode
    • Dan kemudian gunakan kode:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Decode qrcodefile yang ada menggunakanqrtools

    • Instal qrtoolsmenggunakansudo apt-get install python-qrtools
    • Sekarang gunakan kode berikut dalam prompt python Anda

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

Berikut kode lengkapnya dalam sekali jalan:

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.

Peringatan

  • Anda mungkin perlu menginstal PyPNGmenggunakan pip install pypnguntuk menggunakanpyqrcode
  • Jika Anda telah PILmenginstal, Anda mungkin mendapatkan IOError: decoder zip not available. Jika demikian, coba hapus instalan dan instal ulangPIL menggunakan:

    pip uninstall PIL
    pip install PIL
    
  • Jika itu tidak bekerja, coba gunakan Pillowbukan

    pip uninstall PIL
    pip install pillow
    

1
Hai mu 無, terima kasih atas jawaban Anda. Meskipun qrtools membutuhkan zbar dan oleh karena itu bukan python murni, ia memang berfungsi sekarang. Masalah utamanya sekarang adalah saya harus menginstal zbar python binding pada heroku, yang saya ajukan pertanyaan di sini: stackoverflow.com/questions/27406641/… . Saya akan menerima jawaban Anda, tetapi saya akan sangat menghargai jika Anda juga melihat pertanyaan saya yang lain sehingga saya dapat menyelesaikan menjalankan qrtools di heroku. Terima kasih banyak!
kramer65

3
Ini tidak berhasil, memberikan Exception: tostring () telah dihapus.
Bhishan Poudel

2
@BhishanPoudel Saya mengalami ini juga. Tampaknya bug telah diperbaiki dan akan muncul di rilis berikutnya. Bagi siapa pun yang mengalami ini, Anda dapat mengedit baris 181 dari /usr/lib/python2.7/dist-packages/qrtools.py (lokasi mungkin berbeda) dan mengganti "tostring" dengan "tobytes". Ini berjalan dengan baik untuk saya sekarang.
jonthalpy

5
tidak bekerja. AttributeError: modul 'qrtools' tidak memiliki atribut 'QR'
Saeed Mohtasham

1
@SaeedMohtasham cobafrom qrtools import qrtools
Krenair

11

Kode berikut berfungsi dengan baik dengan saya:

brew install zbar
pip install pyqrcode
pip install pyzbar

Untuk pembuatan gambar kode QR:

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

Untuk decoding kode QR:

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

yang mencetak hasilnya:

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

agar solusi di atas berfungsi, Anda juga perlu menjalankan pip install pypng && pip install image
asad_hussain

6

Saya hanya menjawab sebagian dari pertanyaan tentang zbarinstalasi.

Saya menghabiskan hampir setengah jam beberapa jam untuk membuatnya berfungsi pada Windows + Python 2.7 64-bit, jadi berikut adalah catatan tambahan untuk jawaban yang diterima:

  • Unduh https://github.com/NaturalHistoryMuseum/ZBarWin64/releases/download/v0.10/zbar-0.10-cp27-none-win_amd64.whl

  • Instal dengan pip install zbar-0.10-cp27-none-win_amd64.whl

  • Jika Python melaporkan ImportError: DLL load failed: The specified module could not be found.ketika melakukannya import zbar, maka Anda hanya perlu menginstal Paket Visual C ++ Redistributable untuk VS 2013 (Saya menghabiskan banyak waktu di sini, mencoba mengkompilasi ulang tidak berhasil ...)

  • Diperlukan juga: libzbar64-0.dll harus berada dalam folder yang ada di PATH. Dalam kasus saya, saya menyalinnya ke "C: \ Python27 \ libzbar64-0.dll" (yang ada di PATH). Jika masih tidak berhasil, tambahkan ini:

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

PS: Membuatnya bekerja dengan Python 3.x bahkan lebih sulit: Kompilasi zbar untuk Python 3.x .

PS2: Saya baru saja menguji pyzbar dengan pip install pyzbardan itu JAUH lebih mudah, ini bekerja di luar kotak (satu-satunya hal adalah Anda harus menginstal file VC Redist 2013). Juga disarankan untuk menggunakan pustaka ini dalam artikel pyimagesearch.com ini .


1

Untuk Windows menggunakan ZBar

Prasyarat:

Untuk memecahkan kode:

from PIL import Image
from pyzbar import pyzbar

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

Atau, Anda juga dapat mencoba menggunakan ZBarLightdengan mengaturnya seperti yang disebutkan di sini:
https://pypi.org/project/zbarlight/


0

Ada perpustakaan bernama BoofCV yang mengklaim lebih baik dari ZBar dan perpustakaan lainnya .
Berikut adalah langkah-langkah untuk menggunakannya (OS apa saja).

Prasyarat:

  • Pastikan JDK 14+ diinstal dan disetel di $ PATH
  • pip install pyboof

Kelas untuk memecahkan kode:

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

Pemakaian:

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

Diuji dan berfungsi pada Python 3.8 (Windows & Ubuntu)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.