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图片让我很困惑。所以我尝试了pyqrcode
和qrcode
上面的代码,但是在第二行都说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-qrtools
,qr-tools
,python-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码?欢迎所有提示!
答案 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位上运行,所以这里是对接受的答案的补充说明:
使用pip install zbar-0.10-cp27-none-win_amd64.whl
如果Python在执行ImportError: DLL load failed: The specified module could not be found.
时报告import zbar
,那么您只需需要安装Visual C++ Redistributable Packages for VS 2013(我花了很多时间)在这里,试图重新编译失败......)
也是必需的:libzbar64-0.dll必须位于PATH中的文件夹中。在我的情况下,我将其复制到&#34; C:\ Python27 \ libzbar64-0.dll&#34; (在PATH中)
然后做
pip install pyqrcode
pip install qrtools
pip install Pillow
并且主要答案的代码应该有效:
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的库。
以下是使用该版本(任何操作系统)的步骤。
先决条件:
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 先决条件:
choco install 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 如果您认为这是不好的答案,请在评论中告诉我并提供最好的答案。解决方案 我正在开发一个大学考勤管理系统,所以我将这种方法用于学生二维码指纹识别。