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


85

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

我有一个带有QR码的jpg文件,我想使用Python对其进行解码。我找到了一些声称可以做到这一点的库:

PyQRCode这里的网站)可以通过简单地提供如下路径来解码图像中的二维码:

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-qrtoolsqr-toolspython-qrtools和一对夫妇更多的组合,可惜不得要领。我想它指的是这个仓库,它说它是基于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这里的网站)应该是流行的Java ZXing库的Python端口,但是最初的唯一提交已经有6年的历史了,该项目没有任何自述文件或文档。

对于剩下的我发现一对夫妇QR- EN编码器(未编码器),并且能为你解码一些API端点。由于我不希望此服务依赖于其他API端点,因此我希望将解码保持在本地。

因此得出结论;有谁知道我如何用(最好是纯净的)Python从图像中解码QR码?欢迎所有提示!


应该是:“如果myCode.decode(“ / home / kramer65 / qrcode.jpg”)”而不是“ QR(filename ='/ home / kramer65 / qrcode.jpg')'
Dmitry Chichkov

我觉得这是值得一提的提出了一个跟进的问题@ kramer65有关安装zbarpipstackoverflow.com/questions/27406641/...
伊恩

Answers:


107

您可以尝试执行以下步骤并使用进行编码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.

注意事项

  • 您可能需要安装PyPNGusingpip install pypng用于pyqrcode
  • 如果已PIL安装,则可能会得到IOError: decoder zip not available。在这种情况下,请尝试PIL使用以下方法进行卸载和重新安装

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

    pip uninstall PIL
    pip install pillow
    

1
嗨,穆无,谢谢您的回答。尽管qrtools需要zbar,因此它不是纯python,但它确实可以正常工作。现在的主要问题是,我需要在heroku上安装zbar python绑定,对此我在这里提出了一个问题:stackoverflow.com/questions/27406641/…。我将接受您的回答,但是如果您也可以看看我的其他问题,以便我可以解决在heroku上运行qrtools的问题,我将不胜感激。太感谢了!
kramer65

3
这不起作用,给出异常:tostring()已被删除。
Bhishan Poudel

2
我也遇到了@BhishanPoudel。该错误似乎已得到修复,应该在下一发行版中出现。对于遇到此问题的任何人,您都可以编辑/usr/lib/python2.7/dist-packages/qrtools.py的第181行(位置可能有所不同),并将“ tostring”替换为“ tobytes”。现在对我来说运行良好。
jonthalpy '16

5
不起作用。AttributeError的:模块'qrtools'有没有属性'QR'
赛义德Mohtasham

1
@SaeedMohtasham尝试from qrtools import qrtools
Krenair

9

以下代码适合我:

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映像
asad_hussain

6

我仅回答有关zbar安装的部分问题。

我花了将近半小时的时间才能使其在Windows + Python 2.7 64位上运行,所以这里是已接受答案的其他说明:

PS:使其与Python 3.x一起使用更加困难:为Python 3.x编译zbar

PS2:我刚刚使用pyzbar进行了测试pip install pyzbar,它非常容易,它是开箱即用的(唯一的事情是您需要安装VC Redist 2013文件)。还建议在此pyimagesearch.com文章中使用此库。


0

有一个名为BoofCV的库,它声称比ZBar和其他库更好
以下是使用该步骤(任何操作系统)的步骤。

先决条件:

  • 确保已安装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)上使用


0

对于Windows使用 ZBar

先决条件:

  • 通过以下任一方式安装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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.