在树莓派上使用 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 进行条码解码的主要内容,如果未能解决你的问题,请参考以下文章