繁体   English   中英

python 中用于 QR 检测的预处理图像

[英]Preprocessing images for QR detection in python

我使用Zbar和OpenCV读取下图中的二维码,但均未能检测到。 对于 ZBar,我使用 pyzbar 库作为 python 包装器。 有些图像可以正确检测到二维码,有些图像与成功的图像非常相似,但失败了。 我的手机摄像头可以读取上传图像中的二维码,这意味着它是有效的。 下面是代码片段:

from pyzbar.pyzbar import decode
from pyzbar.pyzbar import ZBarSymbol
import cv2

# zbar    
results = decode(cv2.imread(image_path), symbols=[ZBarSymbol.QRCODE])
print(results) 

# opencv
qr_decoder = cv2.QRCodeDetector()
data, bbox, rectified_image = qr_decoder.detectAndDecode(cv2.imread(image_path))
print(data, bbox)

什么样的预处理有助于提高检测二维码的成功率?

附上的图片

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

良好的二值化在这里很有用。 我使用 Kraken 库的kraken.binarization.nlbin() function 让它工作。 该库适用于 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)])]

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

二值化图片

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

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

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

QReader 过去在这些情况下工作得很好。

from qreader import QReader
import cv2

if __name__ == '__main__':
    # Initialize QReader
    detector = QReader()
    img = cv2.cvtColor(cv2.imread('92iKG.jpg'), cv2.COLOR_BGR2RGB)
    # Detect and Decode the QR
    print(detector.detect_and_decode(image=img))

此 QR 的此代码 output:

DE-AAA002065

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM