OpenCV检测与识别条码、二维码
原文链接:http://www.juzicode.com/opencv-note-barcodedetector-qrcodedetector
在 zbar:给我来10G打码图片 一文中桔子菌介绍了怎么用pyzbar识别条码和二维码的方法,今天我们聊聊怎么用OpenCV检测和识别条码、二维码。
1、BarcodeDetector 识别条形码
OpenCV在V4.5.3版本的contrib包中提供了一个barcode::BarcodeDetector类,用这个类可以实现条形码的识别,不过目前仅支持EAN13编码的条形码,其他类型的条形码在当前版本的BarcodeDetector还不支持。
在Python中使用,需要先安装opencv的contrib包:
pip install opencv-contrib-python
导入模块时无差异仍然使用import cv2。
下面我们来看下具体的使用过程,首先创建一个条码检测实例:
import cv2
detect_obj = cv2.barcode_BarcodeDetector()
然后用detectAndDecode()方法检测和识别条码,该方法将检测条码的存在和识别条码封装在一起:
img = cv2.imread("bar.jpg")
is_ok, bar_info, bar_type, points = detect_obj.detectAndDecode(img)
返回的结果包含4个元素,分别是是否检测到条码、识别的条码信息、条码类型和条码位置:
print('is_ok:',is_ok)
print('bar_info:',bar_info)
print('bar_type:',bar_type)
print('points:',points)
运行结果:
is_ok: True
bar_info: ['9787121110085']
bar_type: [2]
points: [[[248.0772 446.5566 ][248.50542 168.47102][725.2236 169.20511][724.79535 447.2907 ]]]
这其中条码位置包含了4个元素,代表了检测到的矩形框的4个角的坐标。
利用这些坐标可以在图像中标注识别到条码位置:
for pos in points:color=(0,0,255)thick=3for p in [(0,1),(1,2),(2,3),(3,0)]:start = int(pos[p[0]][0]),int(pos[p[0]][1])end = int(pos[p[1]][0]),int(pos[p[1]][1])#print(start,end )cv2.line(img,start,end,color,thick)cv2.imshow('img',img)
cv2.imwrite('bar-detect.jpg',img)
cv2.waitKey()
cv2.destroyAllWindows()
当然上述检测方法detectAndDecode()也可以拆分成2个步骤进行,第1步先用detect()检测是否有条码:
img = cv2.imread("bar.jpg")
is_ok, points = detect_obj.detect(img)
print('is_ok:',is_ok)
print('points:',points)
运行结果:
is_ok: True
points: [[[248.0772 446.5566 ][248.50542 168.47102][725.2236 169.20511][724.79535 447.2907 ]]]
第2步将检测到的points传入decode()方法进行识别:
is_ok, bar_info, sn_type = detect_obj.decode(img,points)
print('is_ok:',is_ok)
print('bar_info:',bar_info)
print('bar_type:',bar_type)
运行结果:
is_ok: True
bar_info: ['9787121110085']
bar_type: [2]
标注识别到的条码位置和前面一样,这里不再重复。
2、QRCodeDetector 识别二维码
OpenCV中的QRCodeDetector类可以实现二维码的检测,QRCodeDetector类在OpenCV的3.0版本中就已经出现了,而且是在正式库不是contrib库中。
首先用QRCodeDetector()创建实例:
import cv2
detect_obj = cv2.QRCodeDetector()
然后将图像传入到detectAndDecode()方法中检测和识别:
img = cv2.imread("qr.jpg")
qr_info, points, qr_img = detect_obj.detectAndDecode(img)
返回的结果包含3个元素,第1个为识别的二维码信息,utf8格式的字符串;第2个为检测到的位置,包含4个点;第3个为二值化后的二维码,尺寸较原图更小。
print('qr_info:',qr_info)
print('points:',points)
print('qr_img.shape:',qr_img.shape)
cv2.imshow('qr_img',qr_img)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
qr_info: http://weixin.qq.com/r/Ejr54d-EkYLurZuC928A
points: [[[ 74. 74.][308. 74.][308. 308.][ 74. 308.]]]
qr_img.shape: (37, 37)
这其中位置points包含了检测到的二维码位置,每组包含4个元素,代表了检测到的矩形框的4个角的坐标。用这些坐标可以在图像中标注识别到条码位置:
for pos in points:color=(0,0,255)thick=3for p in [(0,1),(1,2),(2,3),(3,0)]:start = int(pos[p[0]][0]),int(pos[p[0]][1])end = int(pos[p[1]][0]),int(pos[p[1]][1])#print(start,end )cv2.line(img,start,end,color,thick)
cv2.imwrite('qr-detect.jpg',img)
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()
这里是在演示检测效果,不是打广告
也可以用2个步骤分开执行,先用detect()方法检测,返回是否检测到二维码,以及二维码的位置:
img = cv2.imread("qr.jpg")
is_ok, points=detect_obj.detect(img)
print('is_ok:',is_ok)
print('points:',points)
运行结果:
is_ok: True
points: [[[ 74. 74.][308. 74.][308. 308.][ 74. 308.]]]
再用decode()方法识别,传入图像和上一步检测的二维码位置,返回的结果包含二维码信息和二值化后的二维码图像:
qr_info, qr_img = detect_obj.decode(img,points)
print('qr_info:',qr_info)
print('qr_img.shape:',qr_img.shape)
print('qr_img:',qr_img)
运行结果:
qr_info: http://weixin.qq.com/r/Ejr54d-EkYLurZuC928A
qr_img.shape: (37, 37)
qr_img: [[ 0 0 0 ... 0 0 0][ 0 255 255 ... 255 255 0][ 0 255 0 ... 0 255 0]...[ 0 255 0 ... 255 0 0][ 0 255 255 ... 255 255 255][ 0 0 0 ... 255 255 0]]
另外需要注意的是detectAndDecode()只能用来检测图像中只有1个二维码的情况,当图像中有多个二维码时,它的返回值qr_info为空字符串。
如果不确定图像中是否有多个二维码,可以用detectAndDecodeMulti()方法检测可能的多个二维码:
import cv2
detect_obj = cv2.QRCodeDetector()
img = cv2.imread("qr-multi.jpg")
is_ok, qr_info, points, qr_img = detect_obj.detectAndDecodeMulti(img)
print('is_ok:',is_ok)
print('qr_info:',qr_info)
print('points:',points)
print('qr_img:',qr_img)
运行结果:
is_ok: True
qr_info: ['this is a test image', 'www.juzicode.com vx: juzicode']
points: [[[531. 127. ][796. 127. ][796. 392. ][531. 392. ]][[ 73. 75. ][405.00003 75. ][405.00003 406.99997][ 73. 407. ]]]
qr_img: [array([[ 0, 0, 0, ..., 0, 0, 0],[ 0, 255, 255, ..., 255, 255, 0],[ 0, 255, 0, ..., 0, 255, 0],...,[ 0, 255, 0, ..., 0, 255, 0],[ 0, 255, 255, ..., 255, 255, 0],[ 0, 0, 0, ..., 0, 0, 0]], dtype=uint8), array([[ 0, 0, 0, ..., 0, 0, 0],[ 0, 255, 255, ..., 255, 255, 0],[ 0, 255, 0, ..., 0, 255, 0],...,[ 0, 255, 0, ..., 255, 255, 0],[ 0, 255, 255, ..., 255, 0, 255],[ 0, 0, 0, ..., 255, 0, 0]], dtype=uint8)]
detectAndDecodeMulti()方法返回包含4个元素的元组,第1个为是否检测到二维码,第2个为检测到的二维码信息,第3个为二维码边角的4个点,第4个为二值化处理后的二维码图片,后面3个元素均为list类型。
推荐阅读:
又发现一条喵星人将要统治地球的新线索
有了这个方法群聊斗图你就不会输了
有了这款神器,什么吃灰文件都统统现形
一行代码深度定制你的专属二维码(amzqr)
来看看怎么用OpenCV解构Twitter大牛的视觉错觉图
OpenCV检测与识别条码、二维码相关推荐
- 基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码
完整代码:https://download.csdn.net/download/qq_38735017/87416699 原理简介 车牌字符识别使用的算法是 opencv 的 SVM opencv 的 ...
- 基于MATLAB的条码二维码识别系统
基于MATLAB的条码二维码识别系统 课题介绍 本设计研究的是基于数字图像处理的EAN-13条形码识别算法,通过工具平台MATLAB实现.其中图像处理部分是条码识别重要的前期工作,利用MATLAB强大 ...
- Python实现识别多个条码/二维码(二)
这篇博客实现的是"Python实现识别多个条码/二维码(一)"未完成的解码任务.由于系统坏了,软件重装等一系列原因,所以拖到现在..不好意思哈. 在上一篇中我们已经能把两个条形码找 ...
- opencv识别彩色二维码
记录一下识别彩色二维码过程,以及当中遇到的问题和解决办法 1. 由于过程中图片处理需要用到灰度图像,所以读取原图之后,需要转换一个grayImage (CV_BGR2GRAY) 2. Gaussian ...
- 解决自动分析仪条码二维码读取的方案
随着物联网技术的发展,越来越多的企业开始采用条码二维码读取技术来提高企业的生产效率和管理水平.条码二维码读取技术可以帮助企业自动识别和跟踪物品,从而提高企业的生产效率和管理水平.用于检查体液或组织部位 ...
- OPT小讲堂 ∣ SciSmart图像识别之条形码识别、二维码识别
在第十三课中,我们讲了图像识别中的OCR:字符识别. 本课将继续介绍图像识别中的条形码识别.二维码识别.我们将分别介绍二者的基本概念.操作流程.参数解析及应用案例. 条形码识别 条形码识别的概念 条形 ...
- opencv快速实现任意角度二维码矫正
那天听到领导他们在讨论,说要将图片进行个矫正处理,还叫来了算法部的大佬来讨论将要如何处理这个,讨论场面很是激烈 不得不说好奇心是个很神奇的东西,就把我给吸引过去了 我定眼一看,感觉作为JAVA开发的我 ...
- Android 识别图片二维码
zxing依赖: compile 'cn.yipianfengye.android:zxing-library:2.2' 初始化:private String SAVE_PIC_PATH = Envi ...
- VS2010中使用zxing识别图片二维码
在PC端识别图片二维码有ZXing和OpenCV等方式,Opencv4.0也已经在逐步实现和完善这类的功能.在实际项目工程中,通过使用ZXing编译的库文件,在VC2010中的使用MFC框架实现,动态 ...
最新文章
- 骆驼命名法,帕斯卡命名法和匈牙利命名法(转)
- JSP——JSTL语法总结
- Nginx的动态代理,负载均衡,动静分离的简单使用
- 鼠标图标怎么自定义_酷鱼魔鼠——给鼠标添加酷炫的特效
- 淘票票首次公开小程序开发秘籍,踩过坑才知道怎么走!
- 2021广西蒙山中学高考成绩查询,广西省蒙山中学2020-2021学年高二下学第一次月考数学(文)试题及答案.doc...
- python中response对象的属性_关于python:AttributeError:’HTTPResponse’对象没有属性’split’...
- React Native 入门第一篇
- 列出本机JCE支持的Provider、消息摘要算法、公钥私钥算法
- 机器学习- 吴恩达Andrew Ng Week6 Regularized Linear Regression and Bias/Variance知识总结
- matlab求线与面的夹角,基于MATLAB的通用晶面间夹角公式的推导与求解
- 基于 Docker 的几种常用 CentOS7 镜像
- 平均绝对误差python_机器学习回归模型的常用评价指标(8):均方误差MSE、平均绝对误差MAE、平均绝对比例误差MAPE、相关系数R2,方差,相关性...
- 英寸、磅等单位的换算
- Oracle Wallet Manager
- 企业微信自建应用开发
- 【闪亮的玻璃图标悬浮效果】
- (二)IJCAI 国际人工智能联合会议
- HDU 5148 Cities
- AngularJS博友的笔记教程