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

相关推荐
冷眼看人间恩怨4 分钟前
【话题讨论】AI大模型重塑软件开发:定义、应用、优势与挑战
人工智能·ai编程·软件开发
2401_883041086 分钟前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
AI极客菌1 小时前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画
阿_旭1 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
Power20246662 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
数据猎手小k2 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
沉下心来学鲁班2 小时前
复现LLM:带你从零认识语言模型
人工智能·语言模型
数据猎手小k2 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型