Python+CV2二维码识别实战:针对大图小码的预处理与检测

需求:产品中有二维码,但是二维码很小,需要进行整盘识别二维码并记录,难度大,精度低。

一个可行的方案:先识别产品区域,再进一步无损裁剪二维码可能性的区域,裁剪的二维码识别精度低,还需要进一步放大后识别,之前使用了ZXing、Pyzbar 、cv2等最基础的识别库,识别能力一般般。

最后翻了好多资料,最终识别二维码采用的是微信开源的算法模型,能识别模糊的、倾斜角度的,识别能力是很靠谱。

相关代码片段:

import cv2

# 加载 wechat_qrcode 检测器,这段是重点,换了好多个扫码识别的库,最终只有这个微信开源的扫码引擎最靠谱,参考文档:https://zhuanlan.zhihu.com/p/348412200

detector = cv2.wechat_qrcode_WeChatQRCode(

"./qr_mode/detect.prototxt",

"./qr_mode/detect.caffemodel",

"./qr_mode/sr.prototxt",

"./qr_mode/sr.caffemodel"

)

# 二维码识别模块

def qr_processing(crop_img):

try:

# 放大倍数识别,分别1-6倍

for num in range(1, 6):

resized_img = cv2.resize(crop_img, None, fx=num, fy=num, interpolation=cv2.INTER_CUBIC)

res, _ = detector.detectAndDecode(resized_img)

if res and res[0]:

print(f'二维码识别成功: {res[0]}')

return False

except Exception as e:

print(f'二维码识别错误: {str(e)}')

return False

识别产品看我另一篇文章:

使用yolo模型进行目标检测,包含训练步骤和测试代码-CSDN博客

完整的识别例子:

识别速度还可以再快点,最新代码能实现3秒内识别出4X5=20个码。

测试硬件:

1、2000万像素CCD工业相机+支架(摄像头越高清,解析度越好)

2、6毫米焦段镜头,和相机配套的,目的就是为了近距离拍摄出更高清的帧率照片

3、I7 9700系列处理器,主要是加快识别速度,感觉还行,差距不大,识别瞬间会调用所有核心,几乎一秒钟后就搞定了。

相机和镜头成本整套算起来3500左右吧。

批量识别大图小码视频案例