Python 2/3 使用 zbar 库识别图片中的条形码和二维码
Song • 5401 次浏览 • 0 个回复 • 2020年12月08日

环境要求:
- python
- PIL/Pillow或OpenCV/numpy ndarrays
- Decodes locations of barcodes
- zbar库
安装
在Windows Python
中包含zbar
和 DLLs
的轮子。在其他操作系统上,您将需要安装zbar共享库。
Mac OS X:
brew install zbar
Linux:
sudo apt-get install libzbar0
安装pyzbar包;使用第二种形式来安装命令行脚本的依赖项:
pip install pyzbar
pip install pyzbar[scripts]
用法示例
使用PIL.Image格式。
>>> from pyzbar.pyzbar import decode
>>> from PIL import Image
>>> decode(Image.open('pyzbar/tests/code128.png'))
[
Decoded(
data=b'Foramenifera', type='CODE128',
rect=Rect(left=37, top=550, width=324, height=76),
polygon=[
Point(x=37, y=551), Point(x=37, y=625), Point(x=361, y=626),
Point(x=361, y=550)
]
)
Decoded(
data=b'Rana temporaria', type='CODE128',
rect=Rect(left=4, top=0, width=390, height=76),
polygon=[
Point(x=4, y=1), Point(x=4, y=75), Point(x=394, y=76),
Point(x=394, y=0)
]
)
]
它还支持OpenCV加载的numpy.ndarray
的实例图像。
>>> import cv2
>>> decode(cv2.imread('pyzbar/tests/code128.png'))
[
Decoded(
data=b'Foramenifera', type='CODE128',
rect=Rect(left=37, top=550, width=324, height=76),
polygon=[
Point(x=37, y=551), Point(x=37, y=625), Point(x=361, y=626),
Point(x=361, y=550)
]
)
Decoded(
data=b'Rana temporaria', type='CODE128',
rect=Rect(left=4, top=0, width=390, height=76),
polygon=[
Point(x=4, y=1), Point(x=4, y=75), Point(x=394, y=76),
Point(x=394, y=0)
]
)
]
您还可以提供一个元组(pixels, width, height)
,其中图像数据是每个八位bits-per-pixel
。
>>> image = cv2.imread('pyzbar/tests/code128.png')
>>> height, width = image.shape[:2]
>>> # 8 bpp by considering just the blue channel
>>> decode((image[:, :, 0].astype('uint8').tobytes(), width, height))
[
Decoded(
data=b'Foramenifera', type='CODE128',
rect=Rect(left=37, top=550, width=324, height=76),
polygon=[
Point(x=37, y=551), Point(x=37, y=625), Point(x=361, y=626),
Point(x=361, y=550)
]
)
Decoded(
data=b'Rana temporaria', type='CODE128',
rect=Rect(left=4, top=0, width=390, height=76),
polygon=[
Point(x=4, y=1), Point(x=4, y=75), Point(x=394, y=76),
Point(x=394, y=0)
]
)
]
>>> # 8 bpp by converting image to greyscale
>>> grey = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
>>> decode((grey.tobytes(), width, height))
[
Decoded(
data=b'Foramenifera', type='CODE128',
rect=Rect(left=37, top=550, width=324, height=76),
polygon=[
Point(x=37, y=551), Point(x=37, y=625), Point(x=361, y=626),
Point(x=361, y=550)
]
)
Decoded(
data=b'Rana temporaria', type='CODE128',
rect=Rect(left=4, top=0, width=390, height=76),
polygon=[
Point(x=4, y=1), Point(x=4, y=75), Point(x=394, y=76),
Point(x=394, y=0)
]
)
]
>>> # If you don't provide 8 bpp
>>> decode((image.tobytes(), width, height))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/lawh/projects/pyzbar/pyzbar/pyzbar.py", line 102, in decode
raise PyZbarError('Unsupported bits-per-pixel [{0}]'.format(bpp))
pyzbar.pyzbar_error.PyZbarError: Unsupported bits-per-pixel [24]
默认是解码所有符号类型。您可以只查找你要的符号类型
>>> from pyzbar.pyzbar import ZBarSymbol
>>> # Look for just qrcode
>>> decode(Image.open('pyzbar/tests/qrcode.png'), symbols=[ZBarSymbol.QRCODE])
[
Decoded(
data=b'Thalassiodracon', type='QRCODE',
rect=Rect(left=27, top=27, width=145, height=145),
polygon=[
Point(x=27, y=27), Point(x=27, y=172), Point(x=172, y=172),
Point(x=172, y=27)
]
)
]
>>> # If we look for just code128, the qrcodes in the image will not be detected
>>> decode(Image.open('pyzbar/tests/qrcode.png'), symbols=[ZBarSymbol.CODE128])
[]
边界框和多边形
蓝色和粉红色框分别显示pyzbar/tests/qrcode.png
中的条形码的rect
和polygon
(请参阅 bounding_box_and_polygon.py)
Windows错误信息
如果在Windows
上导入pyzbar
时看到ImportError
,则很可能需要Visual Studio 2013
的Visual C ++
可再发行组件包。如果使用64位的Python安装vcredist_x64.exe
,如果使用32位的Python选择vcredist_x64.exe。下载地址vcredist_x64.exe
原创文章,转载请注明 :Python 2/3 使用 zbar 库识别图片中的条形码和二维码 - pytorch中文网
原文出处: https://ptorch.com/news/262.html
问题交流群 :168117787
- 没有评论