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 pyqrcode
meskipun) Karena saya pikir qrcode
mengacu pada pustaka ini yang hanya dapat menghasilkan gambar kode qr itu agak membingungkan saya. Jadi saya mencoba kode di atas dengan pyqrcode
dan 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-qrtools
dan 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!
zbar
denganpip
: stackoverflow.com/questions/27406641/…Jawaban:
Anda dapat mencoba langkah-langkah dan kode berikut menggunakan
qrtools
:Buat
qrcode
file, jika belum adapyqrcode
melakukan 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
qrcode
file yang ada menggunakanqrtools
qrtools
menggunakansudo 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
PyPNG
menggunakanpip install pypng
untuk menggunakanpyqrcode
Jika Anda telah
PIL
menginstal, Anda mungkin mendapatkanIOError: decoder zip not available
. Jika demikian, coba hapus instalan dan instal ulangPIL
menggunakan:Jika itu tidak bekerja, coba gunakan
Pillow
bukansumber
from qrtools import qrtools
Kode berikut berfungsi dengan baik dengan saya:
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)])]
sumber
Saya hanya menjawab sebagian dari pertanyaan tentang
zbar
instalasi.Saya menghabiskan
hampir setengah jambeberapa 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 melakukannyaimport 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 pyzbar
dan 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 .sumber
Untuk Windows menggunakan
ZBar
Prasyarat:
choco install zbar
pip install pyzbar
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
ZBarLight
dengan mengaturnya seperti yang disebutkan di sini:https://pypi.org/project/zbarlight/
sumber
Ada perpustakaan bernama BoofCV yang mengklaim lebih baik dari ZBar dan perpustakaan lainnya .
Berikut adalah langkah-langkah untuk menggunakannya (OS apa saja).
Prasyarat:
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)
sumber