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

相关推荐
搜yyzk6688 小时前
智能电话机器人:1天千通电话,高效低成本
人工智能
fthux12 小时前
装闭 RenoPit 源码解析(09):AnalysisEngine装修闭坑分析主流程
人工智能·ai·开源·github·open source·renopit
敏编程12 小时前
开源项目 NextBand:探索融合健康传感、语音交互与 AI Agent 的下一代可穿戴设备
人工智能
ovO12 小时前
我按下“发送”之后:DeepSeek Harness 如何把一次请求变成 1,177 个增量片段
人工智能·开源·deepseek
昨日之日200612 小时前
LTX-2.5:更清晰、更可控、同步音画、多镜头连贯的AI视频神器
人工智能·音视频
九硕智慧建筑一体化厂家13 小时前
数字化管控落地,直流照明构筑安全照明体系
运维·人工智能·笔记·安全·智慧城市
江厌0113 小时前
本地部署DeepSeek显卡怎么选?我把显存计算公式和实测记录写下来了
人工智能·百度·联想工作站·代理商推荐·渠道对比·工作站
小席是个热心肠13 小时前
AI相关的自我学习
java·人工智能·学习
FII工业富联科技服务13 小时前
工业AI自治的演进趋势:从内容生成到Agent驱动的工厂运营范式转变
人工智能
云和数据.ChenGuang13 小时前
fastapi的参数剖析
人工智能·深度学习·机器学习·语言模型·状态模式·fastapi