opencv检测二维码和条形码

文章目录

  • 1 excel制作简单二维码
  • 2 识别二维码和条形码
    • 2.1 相关库
    • 2.2 decode解码
    • 2.3 圈出二维码的位置
    • 2.4 判断二维码是否授权
  • 3 完整代码
    • 3.1 使用图片进行识别
    • 3.2 使用摄像头实时识别
  • 4 总结

1 excel制作简单二维码

使用excel可以实现制作二维码,但只能实现做英文和数字类型的,步骤如下:

  1. 在任意单元格输入内容

  2. 选项卡里找到开发工具—插入—点击ActiveX控件的最右下角。

  3. 弹出的窗口内,往下滑动选择Microsoft BarCode Control 16.0后,点击确定。

  4. 在任意区域,摁住鼠标左键不放,拖动鼠标,画出合适大小的矩形,松开鼠标,即可获得一个条形码。

  5. 右击条形码,选择属性,点击自定义右边“…”,弹窗内的样式,选择最后一个“11 - QR Code”,点击确定。

  6. 回到属性,找到"LinledCell",输入前面有内容的单元格位置

  7. 得到二维码

2 识别二维码和条形码

2.1 相关库

安装所使用的库

! pip install --user opencv-contrib-python
! pip install --user pyzbar

引入所用的库

import cv2
import numpy as np 
from pyzbar.pyzbar import decode

2.2 decode解码

使用decode函数对二维码的图片进行解码,会看到结果会出现以下一些参数。其中,data代表二维码的内容;type代表是条形码还是二维码类型;rect代表二维码轮廓的信息;polygon二维码轮廓的位置,从左上角逆时针旋转。

img = cv2.imread('code.png')
result = decode(img)
print(result)

结果为:

[Decoded(data=b’1230V’, type=‘QRCODE’, rect=Rect(left=34, top=33, width=193, height=187), polygon=[Point(x=34, y=33), Point(x=34, y=220), Point(x=227, y=220), Point(x=227, y=33)], quality=1, orientation=‘UP’)]

利用循环分别获取解码出来的信息:

for barCode in result:
    print(barCode.data)
    print(barCode.rect)
    print(barCode.polygon)

结果为:

b’1230V’

Rect(left=34, top=33, width=193, height=187)
[Point(x=34, y=33), Point(x=34, y=220), Point(x=227, y=220), Point(x=227, y=33)]

发现会出现“ b’168Qr’ ”,b代表它是以字节为单位。想要去掉这个“b”,那么需要进行解码。

for barCode in result:
    print(barCode.data)
    myData = barCode.data.decode('utf-8')
    print(myData)

运行结果如下:

b’1230V’

1230V

得出结论:解码成功

2.3 圈出二维码的位置

解码结束后,在图片上显示出二维码的位置和二维码的内容。

根据解码后的polygon返回值,框出二维码。

for barCode in result:
    myData = barCode.data.decode('utf-8')
pts = np.array([barCode.polygon], np.int32)     # 创建一个int32数据类型的二维码轮廓数组
pts = pts.reshape((-1, 1, 2))        # 自适应维度大小
cv2.polylines(img, [pts], True, (255, 0, 255), 5)

cv2.polylines():
cv2.polylines(img, pts, isClosed, color, thickness)
其中,pts: 折线顶点数组;isClosed:是否是闭合折线(多边形)

根据解码后的rect返回值,确定二维码内容放置的位置。

pts2 = barCode.rect
cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 255), 2)

cv.putText(img, text, org, fontFace,fontScale,color[, thickness[, lineType[, bottomLeftOrigin]]])

其中,参数依次为:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细

2.4 判断二维码是否授权

先在当前文件夹内创建一个文本文件,里面输入一些授权的二维码内容。

with open('myDataList.txt') as f:
    myDataList = f.read().splitlines()
    print(myDataList)

根据二维码的内容来判断是否授权。如果二维码的内容在这个文本文件内,那么输出“Authorized”,而且框二维码的线条为绿色;如果二维码的内容不在这个文本文件内,那么输出“Un-Authorized”,而且框二维码的线条为红色。

for barCode in result:
    myData = barCode.data.decode('utf-8')

    if myData in myDataList:
        myOutPut = "Authorized"
        myColor = (0, 255, 0)
    else:
        myOutPut = "Un-Authorized"
        myColor = (0, 0, 255)

    pts = np.array([barCode.polygon], np.int32)  # 创建一个int32数据类型的二维码轮廓数组
    pts = pts.reshape((-1, 1, 2))  # 自适应维度大小
    cv2.polylines(img, [pts], True, myColor, 5)
    pts2 = barCode.rect
    cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
    cv2.imshow('22', img)

实现结果为:

在这里插入图片描述

3 完整代码

3.1 使用图片进行识别

import cv2
import numpy as np
from pyzbar.pyzbar import decode

img = cv2.imread('code.png')
result = decode(img)

with open('myDataList.txt') as f:
    myDataList = f.read().splitlines()
    print(myDataList)

for barCode in result:
    myData = barCode.data.decode('utf-8')

    if myData in myDataList:
        myOutPut = "Authorized"
        myColor = (0, 255, 0)
    else:
        myOutPut = "Un-Authorized"
        myColor = (0, 0, 255)

    pts = np.array([barCode.polygon], np.int32)  # 创建一个int32数据类型的二维码轮廓数组
    pts = pts.reshape((-1, 1, 2))  # 自适应维度大小
    cv2.polylines(img, [pts], True, myColor, 5)
    pts2 = barCode.rect
    cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
    cv2.imshow('22', img)
cv2.waitKey(0)

3.2 使用摄像头实时识别

import cv2
import numpy as np
from pyzbar.pyzbar import decode
 
# 导入摄像头
cap = cv2.VideoCapture(0)
cap.set(3, 320) #摄像头的宽度
cap.set(4, 320) #摄像头的高度
cap.set(10, 100) #摄像头的亮度
 
with open('myDataList.txt') as f:
    myDataList = f.read().splitlines()
 
while True:
    success, img = cap.read()
    for barcode in decode(img):
        myData = barcode.data.decode('utf-8')
        print(myData)
 
        if myData in myDataList:
            myOutPut = "Authorized"
            myColor = (0, 255, 0)
        else:
            myOutPut = "Un-Authorized"
            myColor = (0, 0, 255)
 
        pts = np.array([barcode.polygon], np.int32)
        pts = pts.reshape((-1, 1, 2))
        cv2.polylines(img, [pts], True, myColor, 5)
        pts2 = barcode.rect
        cv2.putText(img, myOutPut, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, myColor, 2)
    cv2.imshow("Result",img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
IMPLEX, 0.9, myColor, 2)
    cv2.imshow("Result",img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

4 总结

二维码检测与识别是计算机视觉领域中的一个重要任务,它旨在从图像或视频中检测、定位和解析出二维码信息。
在实现二维码检测与识别的过程中,我们可以借助开源工具库,如OpenCV和ZBar,利用图像处理、特征提取和分类器训练等技术来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器日志管理详解

1. 简介 Docker容器日志是指容器在运行过程中产生的各种日志信息,包括错误、警告、信息等。Docker将所有容器的日志统一管理,方便用户对容器进行监控、故障排查和性能分析。 1.1 什么是Docker容器日志 Docker容器日志是容器在运行过程中产生的各种日志…

ASEMI代理NXP高压三端双向可控硅BT139-800E综合指南

编辑-Z BT139-800E是一种高压三端双向可控硅开关,近年来由于其卓越的性能和多功能性而广受欢迎。这种强大的半导体器件广泛应用于各种应用,包括电机控制、照明控制和温度调节。 BT139-800E的特点 1.高压能力:BT139-800E设计用于处理高压&am…

[Leetcode] 0026. 删除有序数组中的重复项

26. 删除有序数组中的重复项 点击上方,跳转至Leetcode 题目描述 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语…

yum安装LNMP

目录 前言 一、yum安装要用在线yum源 二、安装Nginx 1、搭建Nginx环境 2、安装yum 3、查看Nginx是否安装成功 4、设置开机自启 三、安装MySQL 1、除系统中所有以"mariadb"开头的软件包 2、安装MySQL 3、设置开机自启 4、查看MySQL初始密码 5、修改MySQL密码…

C#和LABVIEW的对决:哪种上位机编程语言更适合你?

今天,我们将谈论主流的上位机编程语言。你听说过C#和LABVIEW吗?它们是的上位机编程语言,C#作为自动化主流编程语言特别受欢迎,LABVIEW用于自动化测试, 首先,我们来了解C#语言。C#是一种文本语言&#xff0c…

Docker教程

Docker 能解决的问题 ⾸先,我们先来看⼏个问题: 1. 合作开发的时候,在本机可以运⾏,在别⼈的电脑上跑不起来。 这⾥我们以 Java Web 应⽤程序为例,⼀个 Java Web 应⽤程序涉及很多东⻄,⽐如 JDK 、 Tomc…

基于ChatGPT的端到端语音聊天机器人项目实战(三)

企业级ChatGPT开发入门实战 第1课 基于ChatGPT的端到端语音聊天机器人项目实战 Gavin老师:NLP_Matrix_Space 1.4 使用FastAPI构建语音聊天机器人后端实战 在后端代码(backend)中调用了OpenAI API及其他的服务,如图1-10所示。 图1- 10 后端代码调用OpenAI API openai_requ…

Spring Boot 日志的主要组件及其特点

Spring Boot 日志的主要组件及其特点 在开发应用程序时,日志是非常重要的一部分。它可以帮助我们了解应用程序的运行情况,发现并解决问题。在 Spring Boot 中,有许多不同的日志框架可供选择。本文将介绍 Spring Boot 日志的主要组件及其特点…

【MySQL高级篇笔记-索引优化与查询优化(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引失效案例 二、关联查询优化 1、采用左外连接 2、采用内连接 3、join语句原理 1.驱动表和被驱动表 2.Simple Nested-Loop Join(简单嵌套循环连接) 3.Index Nested-Loop Join(索引嵌套循环连接) 4.Block Nested-Loop J…

CSS面经

1、CSS的BFC 一、何为BFC BFC(Block Formatting Context)格式化上下文,是Web页面中盒模型布局的CSS渲染模式,指一个独立的渲染区域或者说是一个隔离的独立容器。 二、形成BFC的条件 1、浮动元素,float 除 none 以外的值…

WebRTC音视频会议底层支撑技术

WebRTC允许应用使用P2P通信。WebRTC是一个广泛的话题,在本文中,我们将重点讨以下问题。 为什么Web RTC 如此受欢迎? 在P2P连接过程中会发生什么 信号传递 NATs和ICE STUN & TURN服务器 VP9视频编解码器 WebRTC APIs 安全 1.为什…

物联网到底如何实现万物互联?

前言:作为计算机相关专业的你,绝对听说过物联网这个词,它的解释相比你也听过,叫万物互联,也就是所谓的IOT,但是说实话它到底如何实现的万物互联的你可能还真不知道。不是每个物体都有一个网络接口或者实体接…

C++primer(第五版)第三章(字符串、向量和数组)

本章主要介绍了字符串和vector以及数组,但是vector和数组差不多甚至比数组更加强大,完全可以用vector来代替数组,所以尽管书中有介绍数组,但我也不过多记录,有兴趣的小伙伴可以自行查看原书。 3.1命名空间的using声明…

FreeRTOS_列表和列表项

目录 1. 什么是列表和列表项? 1.1 列表 1.2 列表项 1.3 迷你列表项 2. 列表和列表项初始化 2.1 列表初始化 2.2 列表项初始化 3. 列表项插入 3.1 列表项插入函数分析 3.2 列表项插入过程图示 3.2.1 插入值为 40 的列表项 3.2.2 插入值为 60 的列表项 3…

【二】构造函数和原型

ES6(ECMAScript 6.0)之前js没有引入类的概念 在ES6之前,对象不是基于类创建的,而是用一种称为构建函数的特殊函数来定义对象和它们的特征 ES6之前创建对象可以通过以下三种方式创建对象: 对象字面量: v…

【Spring AOP】面向切面编程,面向切面编程是面向对象编程的孪生兄弟嘛?且听我细细道来! ! !

前言: 大家好,我是良辰丫,面向切面编程和面向对象编程是两种几乎不同的编程方式,并不是所谓的孪生兄弟,但是我们可以说面向切面编程是面向对象编程的一种补充和完善,到底是什么意思呢?请跟随良辰的步伐往下瞧! ! !💌💌💌 🧑个人主…

TypeScript ~ 掌握基本类型 ①

作者 : SYFStrive 博客首页 : HomePage 📜: TypeScript ~ TS 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &…

Redis原理 - IO详解

原文首更地址,阅读效果更佳! Redis原理 - IO详解 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-IO.html 用户空间与内核空间 任何Linux 系统的发行版,其系统内核都是 Linux 。我们的应用都需要通过 Linux 内核与硬…

怎么给PDF添加图片水印?其实很简单,看这篇就会了!

许多人都意识到版权问题的重要性,尽管在日常生活中我们可能很少遇到,但在办公和学习中却经常涉及到此类问题。例如,我们辛辛苦苦制作的PDF文件,如何确保不被他人盗用呢?这就涉及到如何为PDF添加图片水印的问题,相当于…

经典基于外观的SLAM框架-RTABMAP(RGBD视觉输入方案)

经典基于外观的SLAM框架-RTABMAP 文章目录 经典基于外观的SLAM框架-RTABMAP1. RTABMAP整体框架2.RTABMAP的内存管理机制3. 视觉里程计4. 局部地图5. 回环检测与图优化6. 代码工程实践 1. RTABMAP整体框架 RTABMAP是采用优化算法的方式求解SLAM问题的SLAM框架,本赛题…