无法解码 Aztec 条形码

问题描述 投票:0回答:2

我正在尝试使用以下脚本解码 Aztec 条形码:

import zxing
reader = zxing.BarCodeReader()
barcode = reader.decode("test.png")
print(barcode)

这是输入图像:

enter image description here

以下是输出:

条形码(原始=无,解析=无, 路径='/Users/dhiwatdg/Desktop/test.png',格式=无,类型=无, 点=无)

我确定它是有效的阿兹特克条形码。不是脚本无法解码。

python image-processing zxing barcode-scanner aztec-barcode
2个回答
2
投票

未检测到条形码,因为黑条周围存在强烈的“振铃”伪像(可能是“散焦”问题的结果)。
我们可以应用二进制阈值来获得黑色和白色之间更高的对比度。
找到正确的阈值很困难...

为了找到正确的阈值,我们可以从

cv2.THRESH_OTSU
返回的自动阈值开始,并增加阈值直到检测到条形码。
(请注意,需要增加[而不是减少]阈值特定于上图)。


注:

  • 建议的解决方案有点过拟合,而且效率不高。
    我尝试过的其他解决方案,例如锐化不起作用......

代码示例:

import cv2
import zxing

reader = zxing.BarCodeReader()

img = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE)  # Read the image as grayscale.

thresh, bw = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)  # Apply automatic binary thresholding.

while thresh < 245:
    print(f'thresh = {thresh}')
    cv2.imshow('bw', bw)  # Show bw image for testing
    cv2.waitKey(1000)  # Wait 1 second (for testing)
    cv2.imwrite('test1.png', bw)  # Save bw as input image to the barcode reader.
    barcode = reader.decode("test1.png", try_harder=True, possible_formats=['AZTEC'], pure_barcode=True)  # Try to read the barcode

    if barcode.type is not None:
        break  # Break the loop when barcode is detected.

    thresh += 10  # Increase the threshold in steps of 10
    thresh, bw = cv2.threshold(img, thresh, 255, cv2.THRESH_BINARY)  # Apply binary threshold

cv2.imwrite('bw.png', bw)  # Save bw for debugging

cv2.destroyAllWindows()
print(barcode)

thresh
的最后一个值 =
164

最后

bw
图片:
enter image description here


1
投票

@Rotem 的解决方案 效果完美。我还发现通过应用维纳滤波器可以使用以下解决方案。

import cv2
import zxing

img = cv2.imread("test.png")

dst = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
cv2.imwrite("test_tmp.png", dst)

reader = zxing.BarCodeReader()
barcode = reader.decode("test_tmp.png")
print(barcode)
© www.soinside.com 2019 - 2024. All rights reserved.