วิธีถอดรหัสภาพรหัส QR ใน Python (โดยเฉพาะอย่างยิ่งบริสุทธิ์)


88

TL; DR : ฉันต้องการวิธีถอดรหัส QR-code จากไฟล์รูปภาพโดยใช้ 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นี้ล้มเหลวด้วย ฉันพยายามให้คำแนะนำในคำตอบของคำถาม SO นี้แต่ดูเหมือนจะแก้ไม่ได้ ดังนั้นฉันจึงตัดสินใจที่จะดำเนินการต่ออีกครั้ง:

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และคู่มากขึ้นรวมกัน แต่โชคร้ายที่ไม่มีประโยชน์ ฉันคิดว่ามันหมายถึงrepo นี้ซึ่งบอกว่ามันขึ้นอยู่กับ 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 ปีและโครงการไม่มีการอ่านหรือเอกสารใด ๆ

สำหรับส่วนที่เหลือฉันพบโค้ด qr -enสองสามตัว(ไม่ใช่โค้ดเดอร์ ) และปลายทาง API บางตัวที่สามารถถอดรหัสให้คุณได้ เนื่องจากฉันไม่ต้องการให้บริการนี้ขึ้นอยู่กับจุดสิ้นสุด API อื่นฉันจึงต้องการให้การถอดรหัสอยู่ในเครื่อง

เพื่อสรุป; มีใครรู้บ้างว่าฉันจะถอดรหัส QR-code จากรูปภาพใน Python ได้อย่างไร ยินดีต้อนรับทุกคำแนะนำ!


ควรเป็น: "if myCode.decode (" / home / kramer65 / qrcode.jpg ")" ไม่ใช่ "QR (filename = '/ home / kramer65 / qrcode.jpg') '
Dmitry Chichkov

ฉันรู้สึกว่ามันคุ้มค่าที่จะพูดถึงคำถามติดตามที่โพสต์โดย@ kramer65เกี่ยวกับการติดตั้งzbarด้วยpip: stackoverflow.com/questions/27406641/…
Ian

คำตอบ:


109

คุณสามารถลองทำตามขั้นตอนและรหัสต่อไปนี้โดยใช้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 python ที่มีผลผูกพันกับ heroku ซึ่งฉันถามคำถามที่นี่: stackoverflow.com/questions/27406641/… . ฉันจะยอมรับคำตอบของคุณ แต่ฉันจะขอบคุณมากถ้าคุณได้ดูคำถามอื่นของฉันเพื่อที่ฉันจะได้แก้ปัญหาการรัน qrtools บน heroku ขอบคุณล้าน!
kramer65

3
ไม่ได้ผลให้ Exception: 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

11

รหัสต่อไปนี้ใช้ได้ดีกับฉัน:

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 บิตดังนั้นนี่คือบันทึกเพิ่มเติมสำหรับคำตอบที่ยอมรับ:

  • ดาวน์โหลด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

  • หากรายงานหลามImportError: DLL load failed: The specified module could not be found.เมื่อทำimport zbarแล้วคุณจะเพียงแค่ต้องติดตั้งVisual C ++ Redistributable แพคเกจสำหรับ VS 2013 (ผมใช้เวลามากเวลาที่นี่พยายามที่จะคอมไพล์ไม่ประสบความสำเร็จ ... )

  • จำเป็นด้วย: libzbar64-0.dll ต้องอยู่ในโฟลเดอร์ที่อยู่ใน PATH ในกรณีของฉันฉันคัดลอกไปที่ "C: \ Python27 \ libzbar64-0.dll" (ซึ่งอยู่ใน PATH) หากยังไม่ได้ผลให้เพิ่มสิ่งนี้:

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

PS: การทำงานกับงูหลาม 3.x จะยิ่งยาก: รวบรวม Zbar หลาม 3.x

PS2: ฉันเพิ่งทดสอบpyzbarด้วยpip install pyzbarและมันง่ายกว่ามากมันทำงานได้ทันที (สิ่งเดียวคือคุณต้องติดตั้งไฟล์ VC Redist 2013) นอกจากนี้ยังแนะนำให้ใช้ห้องสมุดนี้ในบทความ pyimagesearch.com นี้


1

สำหรับ 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/


0

มีห้องสมุดที่เรียกว่าเป็นBoofCV ซึ่งอ้างว่าดีกว่า Zbar และห้องสมุดอื่น
ต่อไปนี้เป็นขั้นตอนในการใช้งาน (OS ใด ๆ )

ข้อกำหนดเบื้องต้น:

  • ตรวจสอบให้แน่ใจว่าได้ติดตั้ง 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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.