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博客

相关推荐
阿坡RPA8 小时前
手搓MCP客户端&服务端:从零到实战极速了解MCP是什么?
人工智能·aigc
用户27784491049939 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
机器之心9 小时前
刚刚,DeepSeek公布推理时Scaling新论文,R2要来了?
人工智能
算AI11 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
凯子坚持 c12 小时前
基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战
人工智能·paddlepaddle
你觉得20512 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
8K超高清12 小时前
中国8K摄像机:科技赋能文化传承新图景
大数据·人工智能·科技·物联网·智能硬件
hyshhhh12 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
薛定谔的猫-菜鸟程序员13 小时前
零基础玩转深度神经网络大模型:从Hello World到AI炼金术-详解版(含:Conda 全面使用指南)
人工智能·神经网络·dnn
币之互联万物13 小时前
2025 AI智能数字农业研讨会在苏州启幕,科技助农与数据兴业成焦点
人工智能·科技