QR kodlu bir görüntüyü (tercihen saf) Python'da nasıl çözebilirim?


88

TL; DR : Python kullanarak (tercihen saf) bir görüntü dosyasındaki QR kodunu çözmenin bir yoluna ihtiyacım var.

Python kullanarak kodunu çözmek istediğim QR kodlu bir jpg dosyam var. Bunu yaptığını iddia eden birkaç kitaplık buldum:

PyQRCode ( web sitesi burada ) basitçe aşağıdaki gibi bir yol sağlayarak resimlerden qr kodlarının kodunu çözebilir:

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

Bu yüzden onu kullanarak basitçe kurdum sudo pip install pyqrcode. Bununla birlikte, yukarıdaki örnek kodla ilgili garip bulduğum şey, yalnızca içe aktarıyor olması qrcode( pyqrcodeama değil ) Sanırım , yalnızca qr-kod görüntüleri oluşturabilen bu kitaplığaqrcode atıfta bulunduğundan , kafamı karıştırdı. Bu yüzden yukarıdaki kodu ve ile denedim , ancak ikisi de ikinci satırda başarısız oluyor . Dahası, web sitesi Ubuntu 8.10'a (6 yıldan daha uzun bir süre önce çıktı) atıfta bulunuyor ve en son commit'i kontrol etmek için onun genel (git veya başka) bir deposu bulamıyorum. Bu yüzden bir sonraki kütüphaneye geçtim:pyqrcodeqrcodeAttributeError: 'module' object has no attribute 'Decoder'

ZBar ( web sitesi burada ) olduğunu iddia ediyor "an open source software suite for reading bar codes from various sources, such as image files."Bu yüzden onu Mac OSX üzerinde çalıştırmayı denedim sudo pip install zbar. Bu başarısız olur error: command 'cc' failed with exit status 1. Bu SO sorusunun yanıtlarında önerilerde bulunmaya çalıştım , ancak çözemiyorum. Bu yüzden tekrar devam etmeye karar verdim:

Bu blog gönderisine göre aşağıdaki kodu kullanarak görüntüleri kolayca çözebilen 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()

Bu yüzden sudo pip install qrtoolshiçbir şey bulamayan kullanarak yüklemeyi denedim . Ben de bunu denedi python-qrtools, qr-tools, python-qrtoolsama ne yazık ki boşuna, ve bir çift daha fazla kombinasyon. Sanırım ZBar'a dayandığını söyleyen bu repoya atıfta bulunuyor (yukarıya bakın). Kodumu Heroku'da çalıştırmak istememe rağmen (ve dolayısıyla saf bir Python çözümünü tercih etsem de) bir Linux kutusuna (ile sudo apt-get install python-qrtools) başarıyla yükledim ve çalıştırmayı denedim:

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

Bu onu çözüyor gibi görünse de, doğru bir şekilde yapmıyor gibi görünüyor. Ayrıca ZBar'a ihtiyaç duyar ve bu nedenle saf Python değildir. Bu yüzden başka bir kütüphane bulmaya karar verdim.

PyXing ( buradaki web sitesi ), sözde popüler Java ZXing kitaplığının bir Python bağlantı noktasıdır , ancak ilk ve tek kayıt 6 yaşında ve projenin hiçbir şekilde benioku veya dokümantasyonu yok.

Geri kalanı için ben QR bir çift bulundu tr kodlayıcılar (değil de kodlayıcılar) ve sizin için deşifre bazı API uç noktaları. Bu hizmetin diğer API uç noktalarına bağımlı olmasını sevmediğim için, kod çözmeyi yerel olarak tutmak isterim.

Sonuç olarak; Python'da (tercihen saf) resimlerden QR kodlarını nasıl çözebileceğimi bilen var mı? Tüm ipuçları açığız!


Şöyle olmalıdır: 'if myCode.decode ("/ home / kramer65 / qrcode.jpg")' ve 'QR (dosya adı =' / home / kramer65 / qrcode.jpg ') değil'
Dmitry Chichkov

Bunun yarattığı bir takip soru kayda değer olduğunu hissediyorum @ kramer65 yükleme hakkında zbarsahip pip: stackoverflow.com/questions/27406641/...
Ian

Yanıtlar:


109

Aşağıdaki adımları ve kodu kullanarak deneyebilirsiniz qrtools:

  • qrcodeZaten mevcut değilse bir dosya oluşturun

    • Bunu pyqrcodeyapmak için kullandım , bunu kullanarak kurulabilirpip install pyqrcode
    • Ve sonra kodu kullanın:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • Mevcut bir qrcodedosyanın kodunu çözmek içinqrtools

    • qrtoolsKullanarak yüklesudo apt-get install python-qrtools
    • Şimdi python isteminizde aşağıdaki kodu kullanın

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

İşte tek seferde kodun tamamı:

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.

Uyarılar

  • PyPNGKullanmak pip install pypngiçin kullanarak yüklemeniz gerekebilirpyqrcode
  • Eğer bu durum söz olarak PILyüklenmiş, sen alabilirsiniz IOError: decoder zip not available. Bu durumda, şunları kullanarak kaldırmayı ve yeniden yüklemeyi deneyinPIL :

    pip uninstall PIL
    pip install PIL
    
  • O değil işi yaparsa, kullanmayı deneyin Pillowyerine

    pip uninstall PIL
    pip install pillow
    

1
Merhaba mu 無, cevabınız için teşekkürler. Qrtools, zbar gerektirmesine ve bu nedenle saf python olmamasına rağmen, gerçekten şimdi çalışıyor. Şimdi asıl sorun, zbar python bağını heroku üzerine yüklemem gerektiğidir, burada bir soru sordum: stackoverflow.com/questions/27406641/… . Cevabınızı kabul edeceğim, ancak diğer soruma da bir göz atarsanız çok memnun olurum, böylece heroku'da qrtools çalıştırmayı çözebilirim. Milyonlarca kez teşekkürler!
kramer65

3
Bu işe yaramaz, İstisna verir: tostring () kaldırıldı.
Bhishan Poudel

2
@BhishanPoudel Ben de bununla karşılaştım. Görünüşe göre hata düzeltildi ve bir sonraki sürümde görünmesi gerekiyor. Bununla karşılaşan herkes için, /usr/lib/python2.7/dist-packages/qrtools.py'nin 181. satırını düzenleyebilir (konum değişebilir) ve "tobyte" ile "tobyte" ifadesini değiştirebilirsiniz. Şimdi benim için güzel çalışıyor.
jonthalpy

5
çalışmıyor. AttributeError: 'qrtools' modülünün 'QR' niteliği yok
Saeed Mohtasham

1
@SaeedMohtasham tryfrom qrtools import qrtools
Krenair

11

Aşağıdaki kod benim için iyi çalışıyor:

brew install zbar
pip install pyqrcode
pip install pyzbar

QR kodu görüntüsü oluşturmak için:

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

QR kodu çözme için:

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

sonucu yazdıran:

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

yukarıdaki çözümün çalışması için ayrıca pip install pypng && pip install image
asad_hussain

6

Sorunun sadece zbarkurulumla ilgili kısmını yanıtlıyorum .

Windows + Python 2.7 64-bit üzerinde çalışması için yaklaşık yarım saatimi harcadım , işte kabul edilen cevaba ek notlar:

Not: Python 3.x ile çalışmasını sağlamak daha da zor: zbar'ı Python 3.x için derleyin .

PS2: Ben sadece test pyzbar ile pip install pyzbarve çok daha kolaydır, çalışıyor dışı-box (tek şey yüklü VC Redist 2013 dosya olması gerekir olduğunu). Bu pyimagesearch.com makalesinde de bu kitaplığı kullanmanız önerilir .


1

Kullanan Windows için ZBar

Ön koşullar:

Çözmek için:

from PIL import Image
from pyzbar import pyzbar

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

Alternatif olarak, ZBarLightburada belirtildiği gibi kurarak da kullanmayı deneyebilirsiniz :
https://pypi.org/project/zbarlight/


0

ZBar ve diğer kitaplıklardan daha iyi olduğunu iddia eden BoofCV adlı bir kitaplık var .
İşte bunu (herhangi bir işletim sistemi) kullanma adımları.

Ön koşullar:

  • JDK 14+ yüklendiğinden ve $ PATH içinde ayarlandığından emin olun
  • pip install pyboof

Çözülecek sınıf:

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

Kullanım:

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

Python 3.8 (Windows ve Ubuntu) üzerinde test edildi ve çalışıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.