如何 Pythonic 的折腾 QR 码?

~ 兼论什么样的模块值得嗯哼...

背景

最近在折腾机器视觉相关的项目, 其中有一项核心需求是:

嗯哼

IRMarker

~ 即红外线标定器

QRMark

~ 即, 纸质二维码

首先可以搜索到: zbar 0.10 : Python Package Index

然后继续尝试 Google+Youtube 大法:

果断有狠人, 根据 QR Code 标准, 准备用 OpenCV 直接手工来解析...

好在所有知识点都是标准的:

qr-code-parts.png(PNG 图像,1229x624 像素) - 缩放 (88%)

QR Code 结构

QR code

QR 形式数据读取顺序

QR

QR 解码顺序...

cv2.RETR_TREE

cv2.findContours 函式 cv2.RETR_TREE 模式的嵌套结构

QR 标定点

QR 标定点识别方法之一

QR 标定点识别 QR 标定点识别方法之二

...

QRCodeOrientation

QR 方向判别

所以,纯 OpenCV 的 QR 识别思路是明确的:

bitsextraction2

撞哉

qrcode-findContours-edges.png(PNG 图像,173x502 像素)

但是! 原先工作良好的代码,死活就是识别不出所有 Position Detection Pattern

柳岸

~ 碎了一觉起来...

zbar

嗯哼? 感觉不是大家懒, 而是 QR Code 标准又没有变, zbar 完美解决了问题的话, 自然没有后来 Yet another zbar 之类的嗯哼了...

只是, 对应python 模块的文档实在简洁, 搜索案例代码:

» Unusual tasks with video files – reading bar-codes and qr-codes

才发现:

...
for l in symbol.location:
    text = str(symbol.type) + ': ' + str(symbol.data) + ' / ' + str(symbol.quality)
    ...

symbol.location

嗯哼?! what?! 人家 zbar 一直就支持:

:

import zbar
from PIL import Image

...
scanner = zbar.ImageScanner()
scanner.parse_config('enable')
zimage = zbar.Image(width, height, 'Y800', raw)
scanner.scan(zimage)

for symbol in zimage:
    for l in symbol.location:
        text = str(symbol.type) + ': ' + str(symbol.data) + ' / ' + str(symbol.quality)

快速重构原先代码, 几下就完成了原定目标

致谢

-> 汪海

一位认真的普通程序猿, 目测也是折腾了 10小时以上, 幸好依细致的记录了各种基础知识点, 才令俺及时回过味儿来, 找到正确的道路...

特别的回应一下依后来没有嗯哼下去的: 仿射变换

PS:

ArUco: a minimal library for Augmented Reality applications based on OpenCV | Aplicaciones de la Visión Artificial

ArUco

ArUco 更小的标定码形式

OpenCV: Detection of ArUco Markers

问题在, 必须 OpenCV 3.0 以上版本环境才支持!

( ̄▽ ̄)


Author: Zoom.Quiet /mail / gittip / github