当前位置: 首页 > news >正文

Opencv项目实战:03 扫描二维码条形码

1,效果展示

声明:二维码会让图片违规,我处理了一下,大家看看效果

 

 我们扫描出来的结果会有数字,网址链接,英文等。


2,项目准备

(1)安装pyzbar

使用pip下载,打开控制面板,输入:

pip install pyzbar

 (2)在此项目下建立两个.py文件,以及一个.text文件

 打开DataFile.text,输入以下内容:

111111
111112
111113
111114
111115

或则输入其他内容,包括英文和数字,注意不要用中文。 

 (3)准备需要的二维码和条形码

二维码生成网站:

在线二维码生成器 ~ 二维工坊 (2weima.com)https://www.2weima.com/按照你写的DataFile.text里面的内容来生成二维码,可以准备几个其他内容的二维码,因为我们是在项目拓展中才会使用,亦或者使用生活中的二维码,比如,书籍,牛奶盒,微信收款码等等。

条形码生成网站:

免费在线条形码生成器 (t-x-m.com)http://t-x-m.com/条形码无所谓多少。建议大家将准备好的二维码和条形码打印到一张纸上,方便扫描,我昨天打印的不见了,所以效果展示我就用手机拍下来扫描的。

3,代码展示与讲解

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

cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)

while True:

    success, img = cap.read()
    for barcode in decode(img):
        myData = barcode.data.decode('utf-8')
        print(myData)
        pts = np.array([barcode.polygon], np.int32)
        pts = pts.reshape((-1, 1, 2))
        cv2.polylines(img, [pts], True, (255, 0, 255), 5)
        pts2 = barcode.rect
        cv2.putText(img, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX,0.9, (255, 0, 255), 2)

    cv2.imshow('Result', img)
    k=cv2.waitKey(1) & 0xFF
    if k==27:
        break

 本次项目没什么难点,我们直接讲解一下,此项目实现的思路。先看我的分析,再去跟着敲一遍代码。


  • 首先,在本项目中不管是读取图像,还是读取摄像头都能实现,那么我们在这里是实现摄像头的实时扫描。读取网络摄像头(在效果展示中,我采用的外用摄像头),在cap.set()函数里面,用‘3’代表的是宽,用‘4’代表的是高的设置,使其窗口大小合适。
  • 其次是在while True中,success接受的是布尔值,检测是否读取成功,用img读取每一帧的图像。采取pyzbar包中的decode函数,对img进行解码,并将解码后的内容打印在控制台中,大家也可以尝试将解码的内容打印出来,看看有些什么东西。(包括barcode.rect和barcode.data)
  • 除此之外,在Opencv中绘制包围住二维码的方法有很多,比如绘制矩形、绘制多边形;如果是选择矩形框框,识别时二维码存在的倾斜角度会导致添加的框框不能跟着倾斜,而这不是我们想要的效果,因此我们需要选用绘制多边形。具体如下:

第一行使用numpy库中array函数,得到一个四点数据矩阵。其中barcode.polygon作用是从轮廓中提取polygon点,作为顶点(请看下方图一);np.int32则是对于数据的类型约束。
第二行的reshape((-1,1,2))函数,-1表示行有先,主要功能是将原有的数据形状转换为opencv中常用的形状:(x,1,y),便于使用(请看下方图二)。如将(4,2)转换为(4,1,2)。
第三行就是绘画多边形的过程,使用cv.ploylines函数,绘制了一个闭合、紫色、宽度为五的四边形。注意此次的布尔值指的是是否为闭合图型。
 

图一:

图二:

 

  •  紧接着,是放置文本框,那么我们当然不需要它移动,我们希望的是它可以固定在某一点。那么在此处我们采取了rect的方法,得到如下图所表示:

  •  最后,就是展示窗口,在此处如果想关闭窗口,点击Esc键即可,27即是Esc键的Ascll码。

4,项目拓展

项目拓展描述:

公司的员工使用工作牌扫描二维码开门的想法的实现,根据我们之前准备好的DataFile.text,以及生成的二维码,如果扫描的是DataFile.text里的内容就用绿色框和文本表示已经授权;否则,用红色框和文本表示未授权。

我们来看看它的效果是怎么样的。如下

 

 

 

 

项目实现的效果非常好,下面的代码我也不再多做讲解了,快去做起来吧!

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

cap = cv2.VideoCapture(1)
cap.set(3, 640)
cap.set(4, 480)

with open('DataFile.text') 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)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

5,项目总结与评价

本次项目中,由于我也不是很很了解reshape函数,还是查了资料才了解,对于二维码的扫描都是相当不错的,但对于条形码的扫描,在生活中的条形码没能成功,可能与摄像头有关吧。

6,项目素材

可惜,二维码图片可能会违规,大家就自己在网站制作吧,需用自取

 barcode:

相关文章:

  • 智能优化算法:沙猫群算法—附代码
  • node---express
  • [Linux]进程间通信(进程间通信介绍 | 匿名管道 | 命名管道)
  • Allegro Design Entry HDL(OrCAD Capture HDL)RF-PCB菜单详细介绍
  • 电商数仓项目中各层的表
  • 移动安全规范 — 3 -个人密码(PIN)传输规范
  • Spring之AOP思想
  • TypeScript 小结
  • Netty(10)协议设计与解析(IdleStateHandler:空闲检测器、心跳)
  • PostgreSQL数据库统计信息——analyze大致流程
  • C开发环境与基础
  • Android系统_MSM8953_android10_adb连接adbd加入密码检测
  • 23设计模式之 --------- 什么是设计模式?
  • 在以「基础设施」为定位的发展阶段里,产业变成了一个可以有诸多创新的存在
  • Vue相关面试题(1)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 2017-09-12 前端日报
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS小技巧之UIImagePickerController实现头像选择
  • Javascript设计模式学习之Observer(观察者)模式
  • KMP算法及优化
  • Linux gpio口使用方法
  • Making An Indicator With Pure CSS
  • 简单实现一个textarea自适应高度
  • 解析 Webpack中import、require、按需加载的执行过程
  • 使用权重正则化较少模型过拟合
  • 听说你叫Java(二)–Servlet请求
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (二)linux使用docker容器运行mysql
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转)为C# Windows服务添加安装程序
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net 微服务 服务保护 自动重试 Polly
  • .net和php怎么连接,php和apache之间如何连接
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • /proc/stat文件详解(翻译)
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [C++] Windows中字符串函数的种类
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [CF407E]k-d-sequence
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [JavaWeb]——获取请求参数的方式(全面!!!)
  • [json]定义、读写
  • [leetcode] 66. 加一
  • [Leetcode] 寻找数组的中心索引
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
  • [P4V]Perforce(P4V)使用教程
  • [Python学习笔记]Requests性能优化之Session