如何使用zbar在图像上获取检测到的QR码的x,y位置?

Posted

技术标签:

【中文标题】如何使用zbar在图像上获取检测到的QR码的x,y位置?【英文标题】:How to get the x, y position of a detected QR code on an image with zbar? 【发布时间】:2018-10-30 09:02:45 【问题描述】:

我在下图的两个二维码中编码了数字 1639(可下载here)。我打印了它,拍了张照片并试图检测它:

import zbar
from PIL import Image 

scanner = zbar.ImageScanner()
pil = Image.open('20180520_170027_2.jpg').convert('L')
width, height = pil.size
raw = pil.tobytes()
image = zbar.Image(width, height, 'Y800', raw)
result = scanner.scan(image)

for symbol in image:
    print symbol.data.decode(u'utf-8')     # 1639

即使 QR 码的尺寸很小(~1x1 厘米),它也能正常工作,这很棒!

问题:如何获取二维码角的x、y位置?

确定zbar内部有此信息(必须能够解码二维码!),但是如何访问它?

注意:here is how to install zbar 在 Windows 和 Python 2.7 上

【问题讨论】:

你试过dir(symbol)吗? 【参考方案1】:

正如评论中的提示所建议的那样,

print(symbol.location)

给出坐标。

【讨论】:

【参考方案2】:

看起来 zlib 的 C++ 文档中的 zbar::Symbol 类具有 get_location_x()get_location_y()get_location_size() 方法,因此您认为这些数据存在于底层的直觉是正确的。

回到 Python,在读取 zbar Python 绑定的documentation 时,似乎有一个position 字段可用于获取二维码的位置:

import zbar
image = read_image_into_numpy_array(...) # whatever function you use to read an image file into a numpy array
scanner = zbar.Scanner()
results = scanner.scan(image)
for result in results:
    print(result.type, result.data, result.quality, result.position)

二维码的大小可能也可以作为result中的一个字段(例如result.size),您可以使用它来查找其他3个角。

【讨论】:

以上是关于如何使用zbar在图像上获取检测到的QR码的x,y位置?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)

我需要检测扫描图像中 QR 码的大致位置(PDF 转换为 PNG)

如何使用 mask-RCNN 在 python 中计算(x,y)(质心)和掩码的宽度和高度?

在 Yolo v3 Darknet 中测量检测到的对象的 X、Y、Z 坐标

读取QR码 - base64图像高度和宽度

如何仅在计算机视觉中的另一个检测到的对象(y)内检测对象(x)?