Opencv实验合集——实验七:二维码和条形码匹配

1.概念

二维码(QR码)

概念: 二维码是一种矩阵式的二维条码,由黑白方块组成,可以存储大量的信息,包括文本、链接、数字等。QR码的编码方式是在矩阵中通过不同的黑白方块组合表示不同的信息。

特点:

二维码可以存储更多的信息,适用于多种应用场景。

由于采用矩阵结构,二维码的容错性较高,即使部分损坏,仍然能够被正确识别。

OpenCV中的支持: 在OpenCV中,使用 cv2.QRCodeDetector 类可以方便地检测和解码二维码。

条形码

概念: 条形码是一种线性的、一维的编码方式,通过在一条平行线上的不同宽度的条和间隙的组合来表示信息。不同的编码规则(如Code-128、EAN-13等)决定了不同的条形码标准。

特点:

条形码通常只能存储较少的信息,主要用于标识商品、库存等。

条形码的读取速度较快,适用于快速的扫描场景。

OpenCV中的支持: 在OpenCV中,使用 cv2.BarcodeDetector 类可以方便地检测和解码多种条形码类型。

2.有关的函数方法

cv.barcode.BarcodeDetector.detectAndDecodeWithType( img[, points] ) -> retval, decoded_info, decoded_type, points

参数解释:

|--------------|-------------------------------------|
| retval | 如果至少找到一个有效的条形码,则为 true |
| img | 包含条形码的灰度或彩色 (BGR) 图像。 |
| decoded_info | 字符串的 UTF8 编码输出向量或字符串的空向量(如果代码无法解码)。 |
| decoded_type | 字符串向量,指定这些条形码的类型 |
| points | 找到的条形码矩形的顶点的可选输出向量。如果未找到,则为空。 |

cv.GraphicalCodeDetector.detectAndDecode( img[, points[, straight_code]] ) -> retval, points, straight_code

参数解释:

|---------------|------------------------------------|
| img | 包含图形代码的灰度或彩色 (BGR) 图像。 |
| decoded_info | UTF8 编码的字符串输出向量或字符串的空向量(如果代码无法解码)。 |
| points | 找到的图形代码四边形的顶点的可选输出向量。如果未找到,则为空。 |
| straight_code | 包含二值化代码的可选图像向量 |

cv提供的检测方法可能较多适用于固定图片输入进行检测,但是对于大多数场景下都是摄像头进行实时检测,这里我另外展示 pyzbar检测二维码,在pyzbar中实时检测的效果也没有想象中的好,灯光,二维码位置很大程度上影响了识别效果。

3.代码展示

复制代码
import numpy as np
import cv2
def QR_DetectAndDecode(img):
    detector = cv2.QRCodeDetector()
    data, point, outimg = detector.detectAndDecode(img)
    cv2.drawContours(img, [np.int32(point)], 0, (0, 0, 255), 3)
    cv2.putText(img,data,((np.int32(point)[0][0])[0]-200,(np.int32(point)[0][0]+30)[1]-100),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),3)
    return img
def Barcode_DetectAndDecode(img):
    detector = cv2.barcode.BarcodeDetector()
    result, decoded_info, decoded_type, point = detector.detectAndDecodeWithType(img)
    print(result)
    cv2.drawContours(img, [np.int32(point)], 0, (0, 0, 255), 3)
    cv2.putText(img,decoded_info[0]+'   Type:'+decoded_type[0],((np.int32(point)[0][0])[0]-150,(np.int32(point)[0][0]+30)[1]-100),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,0,255),3)
    return img
if __name__ in '__main__':
    path = 'barcode.jpg'
    img = cv2.imread(path)
    img = cv2.resize(img, (1024,1024))
    img = Barcode_DetectAndDecode(img)
    cv2.imshow('pic', img)
    cv2.waitKey(0)





import cv2
import pyzbar.pyzbar as pyzbar

def decodeImg(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    barcodes = pyzbar.decode(gray)
    for barcode in barcodes:
        (x,y,w,h) = barcode.rect
        cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
        barcodeData = barcode.data.decode('utf-8')
        barcodeType = barcode.type
        text = '{} ({})'.format(barcodeData,barcodeType)

        cv2.putText(image,text,(x-100,y-10),cv2.FONT_HERSHEY_SIMPLEX,.5,(0,0,125),2)
    return image

def detect():
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print('error')
    while True:
        ret, img = cap.read()
        im = decodeImg(img)
        cv2.imshow('img',im)
        if cv2.waitKey(1) &0xff == ord('q'):
            break
    cv2.destroyAllWindows()

if __name__ == "__main__":
    detect()

4.效果展示

cv检测二维码和条形码

pyzbar摄像头检测

本次实验主要展示了cv包中的二维码和条形码检测,对于固定拍摄的图片检测效果还是较为理想,但是通过摄像头定时摄取的效果效果不理想,主要是通过用这种方法如果没有及时有二维码或条形码出现容易直接报错阻塞。

如有错误或遗漏,希望小伙伴批评指正!!!!

希望这篇博客对你有帮助!!!!

Opencv实验合集------实验六:模板匹配-CSDN博客

相关推荐
后端小肥肠1 天前
别再眼馋 10w + 治愈漫画!Coze 工作流 3 分钟出成品,小白可学
人工智能·aigc·coze
唐某人丶1 天前
教你如何用 JS 实现 Agent 系统(2)—— 开发 ReAct 版本的“深度搜索”
前端·人工智能·aigc
FIT2CLOUD飞致云1 天前
九月月报丨MaxKB在不同规模医疗机构的应用进展汇报
人工智能·开源
阿里云大数据AI技术1 天前
【新模型速递】PAI-Model Gallery云上一键部署Qwen3-Next系列模型
人工智能
袁庭新1 天前
全球首位AI机器人部长,背负反腐重任
人工智能·aigc
机器之心1 天前
谁说Scaling Law到头了?新研究:每一步的微小提升会带来指数级增长
人工智能·openai
算家计算1 天前
AI配音革命!B站最新开源IndexTTS2本地部署教程:精准对口型,情感随心换
人工智能·开源·aigc
量子位1 天前
马斯克周末血裁xAI 500人
人工智能·ai编程
算家计算1 天前
OpenAI最强编程模型GPT-5-Codex发布!可独立编程7小时,编程效率提升10倍
人工智能·ai编程·资讯
聚客AI1 天前
🌟大模型为什么产生幻觉?预训练到推理的漏洞全揭秘
人工智能·llm·掘金·日新计划