在 zbar:给我来10G打码图片 一文中桔子菌介绍了怎么用pyzbar识别条码和二维码的方法,今天我们聊聊怎么用OpenCV检测和识别条码、二维码。
OpenCV在V4.5.3版本的contrib包中提供了一个barcode::BarcodeDetector类,用这个类可以实现条形码的识别,不过目前仅支持EAN13编码的条形码,其他类型的条形码在当前版本的BarcodeDetector还不支持。
在Python中使用,需要先安装opencv的contrib包:
导入模块时无差异仍然使用import cv2。
下面我们来看下具体的使用过程,首先创建一个条码检测实例:
然后用detectAndDecode()方法检测和识别条码,该方法将检测条码的存在和识别条码封装在一起:
返回的结果包含4个元素,分别是是否检测到条码、识别的条码信息、条码类型和条码位置:
运行结果:
这其中条码位置包含了4个元素,代表了检测到的矩形框的4个角的坐标。
利用这些坐标可以在图像中标注识别到条码位置:
当然上述检测方法detectAndDecode()也可以拆分成2个步骤进行,第1步先用detect()检测是否有条码:
运行结果:
第2步将检测到的points传入decode()方法进行识别:
运行结果:
标注识别到的条码位置和前面一样,这里不再重复。
OpenCV中的QRCodeDetector类可以实现二维码的检测,QRCodeDetector类在OpenCV的3.0版本中就已经出现了,而且是在正式库不是contrib库中。
首先用QRCodeDetector()创建实例:
然后将图像传入到detectAndDecode()方法中检测和识别:
返回的结果包含3个元素,第1个为识别的二维码信息,utf8格式的字符串;第2个为检测到的位置,包含4个点;第3个为二值化后的二维码,尺寸较原图更小。
运行结果:
这其中位置points包含了检测到的二维码位置,每组包含4个元素,代表了检测到的矩形框的4个角的坐标。用这些坐标可以在图像中标注识别到条码位置:
这里是在演示检测效果,不是打广告
也可以用2个步骤分开执行,先用detect()方法检测,返回是否检测到二维码,以及二维码的位置:
运行结果:
再用decode()方法识别,传入图像和上一步检测的二维码位置,返回的结果包含二维码信息和二值化后的二维码图像:
运行结果:
另外需要注意的是detectAndDecode()只能用来检测图像中只有1个二维码的情况,当图像中有多个二维码时,它的返回值qr_info为空字符串。
如果不确定图像中是否有多个二维码,可以用detectAndDecodeMulti()方法检测可能的多个二维码:
运行结果:
detectAndDecodeMulti()方法返回包含4个元素的元组,第1个为是否检测到二维码,第2个为检测到的二维码信息,第3个为二维码边角的4个点,第4个为二值化处理后的二维码图片,后面3个元素均为list类型。