为了账号安全,请及时绑定邮箱和手机立即绑定

预处理图像以在 python 中进行 QR 检测

预处理图像以在 python 中进行 QR 检测

桃花长相依 2022-10-25 14:45:28
我使用 Zbar 和 OpenCV 读取下图中的二维码,但都未能检测到它。对于 ZBar,我使用 pyzbar 库作为 python 包装器。有些图像 QR 被正确检测到,有些图像与成功的图像非常相似但失败了。我的手机摄像头可以读取上传图像中的二维码,这意味着它是有效的。下面是代码片段:from pyzbar.pyzbar import decodefrom pyzbar.pyzbar import ZBarSymbolimport cv2# zbar    results = decode(cv2.imread(image_path), symbols=[ZBarSymbol.QRCODE])print(results) # opencvqr_decoder = cv2.QRCodeDetector()data, bbox, rectified_image = qr_decoder.detectAndDecode(cv2.imread(image_path))print(data, bbox)什么样的预处理有助于提高二维码检测的成功率?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

zbar,它做了一些预处理,没有检测到二维码,你可以测试运行zbarimg image.jpg

好的二值化在这里很有用。我使用kraken.binarization.nlbin()Kraken 库的功能让它工作。该库适用于 OCR,但也适用于 QR 码,通过使用非线性处理。Kraken 二值化代码在这里

这是示例的代码:

from kraken import binarization

from PIL import Image

from pyzbar.pyzbar import decode

from pyzbar.pyzbar import ZBarSymbol


image_path = "image.jpg"

# binarization using kraken

im = Image.open(image_path)

bw_im = binarization.nlbin(im)

# zbar

decode(bw_im, symbols=[ZBarSymbol.QRCODE])

[Decoded(data=b'DE-AAA002065', type='QRCODE', rect=Rect(left=1429, top=361, width=300, height=306), polygon=[Point(x=1429, y=361), Point(x=1429, y=667), Point(x=1729, y=667), Point(x=1723, y=365)])]

下图为二维码后二维码的清晰图像:

//img1.sycdn.imooc.com//63578649000166ea06540363.jpg

查看完整回答
反对 回复 2022-10-25
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

我有一个类似的问题,Seanpue 的回答让我走上了解决这个问题的正确轨道。由于我已经在使用 OpenCV 库而不是 PIL 进行图像处理,因此我使用OpenCV 教程中关于 Image Thresholding的说明来执行 Otsu 的二值化。这是我的代码:


import cv2

from pyzbar.pyzbar import decode

from pyzbar.pyzbar import ZBarSymbol


image_path = "qr.jpg"

# preprocessing using opencv

im = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

blur = cv2.GaussianBlur(im, (5, 5), 0)

ret, bw_im = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# zbar

decode(bw_im, symbols=[ZBarSymbol.QRCODE])

[Decoded(data=b'DE-AAA002065', type='QRCODE', rect=Rect(left=1429, top=362, width=300, height=305), polygon=[Point(x=1429, y=362), Point(x=1430, y=667), Point(x=1729, y=667), Point(x=1724, y=366)])]

应用高斯模糊应该可以去除图片中的噪点,以使二值化更有效,但对于我的应用程序来说,它实际上并没有太大的区别。至关重要的是将图像转换为灰度以使阈值函数起作用(在此处通过打开带有cv2.IMREAD_GRAYSCALE标志的文件来完成)。


查看完整回答
反对 回复 2022-10-25
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信