I encoded the number 1639 in the two QR codes of the image below (downloadable here). I printed it, took a photo and tried to detect it:
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
It works, even if the size of the QR code is small (~1x1 cm), which is great!
Question: how to get the x, y position of the corners of the QR codes?
It's sure that zbar
has this information internally (mandatory to be able to decode the QR code!), but how to get access to it?
Note: here is how to install zbar
on Windows and Python 2.7
It looks like the
zbar::Symbol
class in the C++ docs of zlib has the methodsget_location_x()
,get_location_y()
andget_location_size()
, so your intuition that this data exists underneath was right.Coming back to Python, when reading the documentation of the zbar Python binding, it looks like a
position
field is available to get the location of the QR code:The size of the QR code is probably also available as a field in
result
(e.g.result.size
), and you can use it to find the 3 other corners.As suggested by a hint in a comment,
gives the coordinates.