用Python和OpenCV搭建自己的一维码和QRCode扫描仪(步骤 + 源码)

导  读

    本文主要介绍使用Python和OpenCV搭建自己的一维码和QRCode扫描仪(步骤 + 源码)。

项目简介

图片

    本文我们将创建一个程序来扫描图像中的二维码和条形码。对于这个程序,我们需要三个包,分别是OpenCV、NumPy和pyzbar。大多数 Python 程序员都熟悉 OpenCV 和 Numpy 库。OpenCV 是一个开源计算机视觉和机器学习库。它是一个有用的图像处理库。我们在项目中使用这个库来处理设备捕获的视频中的每一帧。我们在这里使用 Numpy,因为 pyzbar 可与 OpenCV / numpy ndarrays 配合使用。而 pyzbar 库用于从给定图像中读取条形码和 QR 码。它支持 EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 39、Interleaved 2 of 5 和 QR 码。这是对我们的项目和库的简短介绍,下面将详细介绍实现步骤。

      

实现步骤

    【1】安装需要的库。主要有OpenCV, Numpy, PyZbar。

#安装OpenCVpip install opencv-python​​​​​​
#安装pyzbarpip install pyzbar​​​​​​​
#安装numpypip install numpy

    【2】导入所有需要的库。代码如下:​​​​​​​

import cv2import numpy as npfrom pyzbar.pyzbar import decode

    【3】从摄像头设备捕获视频。代码如下:​​​​​​​

cap = cv2.VideoCapture(0)while True:    ret, frame = cap.read()    cv2.imshow('image', frame)    code = cv2.waitKey(10)    if code == ord('q'):        break

    【4】创建解码器函数,用于解码给定图像中的条形码和QRCode。代码如下:​​​​​​​

def decoder(image):    gray_img = cv2.cvtColor(image,0)    barcode = decode(gray_img)
    for obj in barcode:        points = obj.polygon        (x,y,w,h) = obj.rect        pts = np.array(points, np.int32)        pts = pts.reshape((-1, 1, 2))        cv2.polylines(image, [pts], True, (0, 255, 0), 3)
        barcodeData = obj.data.decode("utf-8")        barcodeType = obj.type        string = "Data: " + str(barcodeData) + " | Type: " + str(barcodeType)                cv2.putText(frame, string, (x,y), cv2.FONT_HERSHEY_SIMPLEX,0.8,(0,0,255), 2)        print("Barcode: "+barcodeData +" | Type: "+barcodeType)

    该函数获取图像,然后从图像中识别 QR 码和条形码,并对其值进行解码。这里的条形码是由解码函数识别的条形码和QRcode对象的列表。每个对象包含矩形、多边形、数据、类型等属性。矩形和多边形属性给出了条形码和QR码的位置。

    完整代码和检测效果:​​​​​​​

import cv2import numpy as npfrom pyzbar.pyzbar import decode
def decoder(image):    gray_img = cv2.cvtColor(image,0)    barcode = decode(gray_img)
    for obj in barcode:        points = obj.polygon        (x,y,w,h) = obj.rect        pts = np.array(points, np.int32)        pts = pts.reshape((-1, 1, 2))        cv2.polylines(image, [pts], True, (0, 255, 0), 3)
        barcodeData = obj.data.decode("utf-8")        barcodeType = obj.type        string = "Data " + str(barcodeData) + " | Type " + str(barcodeType)                cv2.putText(frame, string, (x,y), cv2.FONT_HERSHEY_SIMPLEX,0.8,(255,0,0), 2)        print("Barcode: "+barcodeData +" | Type: "+barcodeType)
cap = cv2.VideoCapture(0)while True:    ret, frame = cap.read()    decoder(frame)    cv2.imshow('Image', frame)    code = cv2.waitKey(10)    if code == ord('q'):        break

图片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中线程/线程池,进程/进程池的创建

创建子线程 # 创建子线程t1 threading.Thread(targetjob,args(1,))# 执行子线程t1.start()# 等待子线程执行print("waiting threading")t1.join()print("threading done")创建子进程 # 创建子进程p1 multiprocessing.Process(targetjob,args(1,),name&qu…

linux kernel 内存踩踏之KASAN_HW_TAGS(MTE)(三)

一、背景 linux kernel 内存踩踏之KASAN(一)_kasan版本跟hasan版本区别-CSDN博客 linux kernel 内存踩踏之KASAN_SW_TAGS(二)-CSDN博客 最后来介绍一下KASAN_HW_TAGS,ARM64上就是MTE,这个特性在ARMv8.5支…

贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability(概率):独立性/条件独立性:Probability Theory(概率论):Graphical models (概率图模型)什么是图模型(Graphical Models)图是什么计算机科学中的图模型:为什么图模型有用?图模型:统一框架图模型在机器学习中的…

@ 代码随想录算法训练营第8周(C语言)|Day51(动态规划)

代码随想录算法训练营第8周(C语言)|Day51(动态规划) Day51、动态规划(包含题目 139.单词拆分 ) 139.单词拆分 题目描述 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是…

C++数据结构与算法——栈与队列

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

在Ubuntu-12.04环境下使用新的Rust开发工具

在老旧的系统环境下使用Rust开发工具 笔者的一台硬件资源紧张的旧电脑安装了Ubuntu-12.04,希望在其上运行比较新的Rust开发工具,但却发现其因glibc较老,不能正常运行cargo工具,结果如下: yejqUNIX:~$ uname -a Linux…

电商+支付双系统项目------支付系统的构思

本篇文章会讲讲支付的一些相关的名词概念以及怎么去设计支付系统,通过理解支付的这些名词概念和支付系统的架构,为接下来写支付系统的代码做好准备。 目录 支付------支付资质 支付------支付场景 微信 付款码支付 Native支付 支付宝 条码付 扫码…

问卷设计初探:题目类型概览与注意事项梳理

问卷法常被人们应用于社会调查中,它能反馈出最真实的社会信息。所以,很多企业为了最大程度地了解市场,也经常使用问卷调查法进行研究。不过,想要发挥出问卷法的最大用处,前提是要将问卷设计规范并且可量化。 想要设计…

在JavaScript中的防抖函数 - 通过在React中构建自动完成功能来解释

当你将一个新应用推向生产环境时,你希望确保它用户友好。网站的性能是用户体验的关键部分。每个用户都希望网站及其内容能够快速加载。每一秒都是宝贵的,可能导致用户再也不会访问你的网站。 在本指南中,我们将了解JavaScript中一个非常重要…

SQL 精讲-MySql 常用函数,MySQL语句精讲和举例

FORMAT(数值,保留位数) 四舍五入 SELECT *,FORMAT(score/3,2) from studentROUND(数值,保留位数) 四舍五入 SELECT ROUND(score/3,2) from studentCONCAT(字符串 1,字符串 2) 字符串拼接 SELECT CONCAT(customer_name, (,address,)) from mt_customerLEFT(字符串,长度) 截取…

内存处理函数 内存池

内存处理函数 内存申请函数(stdlib.h) malloc 原形:void *malloc(size_t size); 功能:用于动态分配指定大小的内存块,分配的内存块不会被初始化,内容是未定义的。 返回值:若分配成功,返回一个指向该内存块…

同步缓冲器设计(Synchronous FIFO)

缓冲器又称为队列,是一种数据暂存的机制。缓冲器存在的必要是因为当数据传出端传出数据时,接收端不一定能实时地接收,如果接收端不能实时地接收,又无缓冲器的存在,数据将不可避免会遗失。如果输出输入端的时钟频率一致…

2024.2.15 模拟实现 RabbitMQ —— 消息持久化

目录 引言 约定存储方式 消息序列化 重点理解 针对 MessageFileManager 单元测试 小结 统一硬盘操作​​​​​​​ 引言 问题: 关于 Message(消息)为啥在硬盘上存储? 回答: 消息操作并不涉及到复杂的增删查改消…

人工智能学习与实训笔记(十四):Langchain之Agent

人工智能专栏文章汇总:人工智能学习专栏文章汇总-CSDN博客 本篇目录 0、概要 1、Agent整体架构 2、langchain中agent实现 3、Agent业务实现逻辑 0、概要 Agent是干什么的? Agent的核心思想是使用语言模型(LLM)作为推理的大脑…

redis为什么使用跳跃表而不是树

Redis中支持五种数据类型中有序集合Sorted Set的底层数据结构使用的跳跃表,为何不使用其他的如平衡二叉树、b树等数据结构呢? 1,redis的设计目标、性能需求: redis是高性能的非关系型(NoSQL)内存键值数据…

SpringBoot中公共字段的自动填充

目录 1 前言 2 使用方法 2.1 自定义枚举类 2.2 自定义注解AutoFill 2.3 自定义切面类并设定切入点 2.4 切面类中设置前置通知,对公共字段赋值 2.5 在方法上添加自定义注解 3 最后 1 前言 在我们的项目中,项目表可能会有一些公共的字段需要我们的…

【51单片机实验笔记】开关篇(二) 矩阵按键

目录 前言原理图分析矩阵按键扫描算法 软件实现1. 矩阵键盘检测2. 简易计算器实现 总结 前言 本节内容,我们学习一下矩阵按键,它是独立按键的阵列形式,常见的应用即键盘。 本节涉及到的封装源文件可在《模块功能封装汇总》中找到。 本节完…

websocket数据帧格式

客户端、服务端数据的交换,离不开数据帧格式的定义。因此,在实际讲解数据交换之前,我们先来看下WebSocket的数据帧格式。 WebSocket客户端、服务端通信的最小单位是帧(frame),由1个或多个帧组成一条完整的消…

基于协同过滤的时尚穿搭推荐系统

项目:基于协同过滤的时尚穿搭推荐系统 摘 要 基于协同过滤的时尚穿搭推荐系统是一种能自动从网络上收集信息的工具,可根据用户的需求定向采集特定数据信息的工具,本项目通过研究服饰流行的分析和预测的分析和预测信息可视化时尚穿搭推荐系统…

2月12作业

1.会出现段错误,因为p申请的堆区内存未返回给str,导致str仍然指向NULL,无法将"hello world"拷贝给str 2.会出现段错误,因为p是一个局部变量,函数结束时,p将被释放,不能返回它的地址 …