【问题标题】:Preprocessing images for QR detection in python预处理图像以在 python 中进行 QR 检测
【发布时间】:2020-05-12 04:21:41
【问题描述】:

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

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)

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

【问题讨论】:

标签: python image-processing qr-code zbar


【解决方案1】:

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

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

示例代码如下:

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

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

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,Seanpue 的回答让我在这个问题上走上了正轨。由于我已经在使用 OpenCV 库而不是 PIL 进行图像处理,因此我使用它使用 OpenCV tutorial on 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 标志打开文件来完成)。

    【讨论】:

    • 除此之外,我发现我必须缩小相关图像的大小。 4000x3000 的相机照片似乎存在问题,但当缩放到 1600x1200 宾果游戏时!
    猜你喜欢
    • 2021-05-27
    • 2021-02-13
    • 2015-11-09
    • 2018-12-15
    • 2018-02-06
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多