opencv检测二维码和条形码

news/2024/11/29 20:36:45/

文章目录

  • 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.rectcv2.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 decodeimg = 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.rectcv2.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.rectcv2.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,利用图像处理、特征提取和分类器训练等技术来实现。


http://www.ppmy.cn/news/487432.html

相关文章

如何使用@umijs/plugin-qiankun搭建微前端项目

umijs/plugin-qiankun是一个基于UmiJS框架的插件,用于实现乾坤微前端架构。乾坤微前端是一种前端架构模式,可以将一个大型的前端应用拆分成多个小型的子应用,每个子应用可以独立开发、独立部署、独立运行,同时可以通过乾坤框架进行…

有关Intel SGX的资料汇总

1.github上有关sgx的文章总结 GitHub - vschiavoni/sgx-papers: A list of system papers using/about Intel SGX 2.有关SGX的开源项目的总结 GitHub - Maxul/Awesome-SGX-Open-Source: Open Source Projects that helps exploit Intel SGX technology 3.Intel收集的有关SG…

伦敦银xag是什么意思?

简单来说,xag就是伦敦银的意思,也就是国际市场上的现货白银,是在行情播报软件上的代码,一些平台会把自己支持交易品种,用货币形式统一表示,例如XAU/USD是黄金对美元,XAG/USD白银兑美元&#xff…

xv6-riscv

我的环境:ubuntu 22.04 LTS,用qemu模拟riscv环境,加载xv6操作系统 我的安装过程如下: 1.在ubuntu中打开终端,输入这条指令 sudo apt-get update 2.再安装一些基本的软件 sudo apt-get install net-tools gcc g gi…

Intel SGX Enclave初始化

这张图改自Intel SGX手册的一张图(一年前看的,实在记不住在哪个位置了)。相对于那张图,我把PMH、ME两个硬件模块画上去了。 下图是Enclave初始化时硬件间关系图,Enclave初始化大致经历了(1)申请Enclave内存,(2)创建SE…

2021 XV6 7: networking

实验链接如下所示: Lab: networking 实验不难,但是其实细节挺多的感觉。 首先是几个核心数据结构的理解。 #define TX_RING_SIZE 16 static struct tx_desc tx_ring[TX_RING_SIZE] __attribute__((aligned(16))); static struct mbuf *tx_mbufs[TX_R…

运行xv6系统

原文可在运行Xv6系统查看到,后续的更新将会更新到个人博客 第二次倒腾这个操作系统了。整个过程其实很简单。我使用的操作系统是 Ubuntu Server 18.04.1 LTS 64bit,但是按照学院官网的指导去操作似乎有点问题?总之就是没成功。 系统下载 首…

ST-GCN使用

< 1 > 训练ST-GCN 1, 制作训练集; stgcn官方使用了Kinetics-skeleton和NTU RGBD两个数据集来训练网络,因此,我们需要将自己的训练集先转换为这两个数据集的格式然后在转化为stgcn的格式,或者直接转化为stgcn的格式, (1)在目录tools/下有两个文件kinetics_gendata.py 和 n…