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

时间:2019-06-09 21:36:16

标签: camera raspberry-pi zbar

我正在使用pyzbar通过Pi Camera v1(分辨率1296x972)在Raspberry Pi 3上解码条形码。 Qr码被很好地解码。解码二维条形码(CODABAR)时,成功率非常低。

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

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

print (d)

有没有想到可能是什么问题?

更新:

以下图像是我的特定用例。 eBarcode image 因为我正在使用Pi Camera v1拍摄图像,所以尝试对图像的清晰度进行调整:

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

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

enter image description here

1 个答案:

答案 0 :(得分:0)

您需要从图像中删除黑色边框。根据{{​​3}}, 您可以简单地裁剪图像,然后将图像提供给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)