如何在(最好是纯粹的)Python中解码QR码图像?

时间:2014-12-01 16:58:42

标签: python decode qr-code zxing zbar

  

TL; DR :我需要一种方法来解码使用(最好是纯粹的)Python的图像文件中的QR码。

我有一个带有QR码的jpg文件,我想用Python解码。我找到了几个声称要这样做的图书馆:

PyQRCode website here)据说可以通过简单地提供这样的路径来解码图像中的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指的是this library 生成 qr-code图片让我很困惑。所以我尝试了pyqrcodeqrcode上面的代码,但是在第二行都说AttributeError: 'module' object has no attribute 'Decoder'失败了。此外,the website指的是Ubuntu 8.10(超过6年前推出),我无法找到它的公共(git或其他)存储库来检查最新的提交。所以我转到了下一个图书馆:

ZBar website here)声称是"an open source software suite for reading bar codes from various sources, such as image files."所以我尝试在运行sudo pip install zbar的Mac OSX上安装它。这与error: command 'cc' failed with exit status 1失败。我试着在this SO question的答案中提出建议,但我似乎无法解决它。所以我决定继续前进:

QRTools ,根据this blogpost,可以使用以下代码轻松解码图像:

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-qrtoolsqr-toolspython-qrtools以及其他几种组合,但遗憾的是无济于事。我想它指的是this 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 website here)应该是流行的Java ZXing library的Python端口,但最初的和唯一的提交是6年,项目没有自述文件或文档无论如何。

其余的我发现了一对qr- en 编码器(不是 de 编码器)和一些可以解码的API端点。由于我不希望此服务依赖于其他API端点,因此我希望将解码保持在本地。

总结;谁能知道如何从(优选纯粹的)Python中的图像中解码QR码?欢迎所有提示!

6 个答案:

答案 0 :(得分:83)

您可以使用qrtools尝试以下步骤和代码:

  • 创建qrcode文件(如果尚未存在)

    • 我使用pyqrcode执行此操作,可以使用pip install pyqrcode
    • 进行安装
    • 然后使用代码:

      >>> import pyqrcode
      >>> qr = pyqrcode.create("HORN O.K. PLEASE.")
      >>> qr.png("horn.png", scale=6)
      
  • 使用qrtools

    解码现有的qrcode文件
    • 使用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。在这种情况下,try uninstalling and reinstalling PIL使用:

    pip uninstall PIL
    pip install PIL
    
  • 如果这不起作用,请尝试使用Pillow

    pip uninstall PIL
    pip install pillow
    

答案 1 :(得分:3)

以下代码对我来说很好用:

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

答案 2 :(得分:2)

我花了将近半个小时的时间让它在Windows + Python 2.7 64位上运行,所以这里是对接受的答案的补充说明:

并且主要答案的代码应该有效:

import pyqrcode
qr = pyqrcode.create("HORN O.K. PLEASE.")
qr.png("horn.png", scale=6)
import qrtools
qr = qrtools.QR()
qr.decode("horn.png")
print qr.data

答案 3 :(得分:0)

有一个名为BoofCV which claims to better than ZBar and other libraries的库。
以下是使用该版本(任何操作系统)的步骤。

先决条件:

  • 确保已在$ PATH中安装并设置了JDK 14 +
  • 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)上运行

答案 4 :(得分:0)

对于使用ZBar的Windows

先决条件:

  • 通过以下任一方式安装ZBar:
  • pip install pyzbar

要解码:

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/

答案 5 :(得分:0)

我只是找到了一种仅使用 cv2 的新方法 它对我有用,在你的情况下检查它。波纹管代码将解码一个二维码

import cv2
# Name of the QR Code Image file
filename = "attandence_Record_QR_code.png"
# read the QRCODE image
image = cv2.imread(filename)
# initialize the cv2 QRCode detector
detector = cv2.QRCodeDetector()
# detect and decode
data, vertices_array, binary_qrcode = detector.detectAndDecode(image)
# if there is a QR code
# print the data
if vertices_array is not None:
  print("QRCode data:")
  print(data)
else:
  print("There was some error") 

这很容易,没有其他依赖,因为我们都有 cv2,因为我们是 Python 程序员 LOL 如果您认为这是不好的答案,请在评论中告诉我并提供最好的答案。解决方案 我正在开发一个大学考勤管理系统,所以我将这种方法用于学生二维码指纹识别。