在树莓派上使用 pyzbar 进行条码解码

Posted

技术标签:

【中文标题】在树莓派上使用 pyzbar 进行条码解码【英文标题】:Barcode decoding with pyzbar on raspberry pi 【发布时间】:2019-06-09 21:36:16 【问题描述】:

我正在使用 pyzbar 使用 Pi Camera v1(分辨率 1296x972)解码 Raspberry Pi 3 上的条形码。二维码解码得很好。在解码二维条码(CODABAR)时,成功率很低。

我尝试从视频流中保存一帧并在 Raspberry 上使用 pyzbar 对其进行解码,但它失败了。当我尝试在 Ubuntu 上解码相同的图像并成功解码时。

from pyzbar import pyzbar
from PIL import Image
img = Image.open('sampleImage.png')
d = pyzbar.decode(img)

print (d)

任何想法可能是什么问题?

更新:

下图是我的具体用例。 因为我使用 Pi Camera v1 拍照,所以我尝试对图像清晰度进行调整:

from picamera import PiCamera
self.camera = PiCamera()
self.camera.sharpness = 100

以下图像的清晰度为 100。但是,pyzbar 在 Raspberry Pi 上仍然无法解码。

【问题讨论】:

【参考方案1】:

您需要从图像中删除黑色边框。根据this answer, 您可以简单地裁剪图像,然后将图像提供给pyzbar.decode() 函数。

import cv2
from pyzbar import pyzbar
import numpy as np


def autocrop(image, threshold=0):
    """Crops any edges below or equal to threshold
    Crops blank image to 1x1.
    Returns cropped image.
    """
    if len(image.shape) == 3:
        flatImage = np.max(image, 2)
    else:
        flatImage = image
    assert len(flatImage.shape) == 2

    rows = np.where(np.max(flatImage, 0) > threshold)[0]
    if rows.size:
        cols = np.where(np.max(flatImage, 1) > threshold)[0]
        image = image[cols[0]: cols[-1] + 1, rows[0]: rows[-1] + 1]
    else:
        image = image[:1, :1]

    return image


if __name__ == "__main__":
    image = cv2.imread('sampleImage.png')
    crop = autocrop(image, 165)
    d = pyzbar.decode(crop)
    print(d)

【讨论】:

我这样做了,它仍然表现相同:在 RaspberryPi 上解码失败,而在 Ubuntu 上解码成功。 您是否将这个示例用于从相机读取的图像?我将示例用于提供的图像,而不是从 Pi 相机捕获的任何图像。 提供的图像也是从 Pi 相机捕获的。这只是一个完整描述问题的示例图像。

以上是关于在树莓派上使用 pyzbar 进行条码解码的主要内容,如果未能解决你的问题,请参考以下文章

树莓派上使用DHCPig进行DHCP池耗尽攻击

树莓派上使用Slowloris进行DDoS攻击

电子在树莓派上不起作用

树莓派上使用mdk3对无线热点进行DoS攻击

如何在树莓派上安装Android 6.0系统

树莓派上Java程序作为linux服务并开机自动启动