用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

图片

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

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

相关文章

【leetcode题解C++】51.N皇后 and 76.最小覆盖子串

51. N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方…

C#安装CommunityToolkit.Mvvm依赖

这里需要有一定C#基础, 首先找到右边的解决方案,右键依赖项 然后选择nuget管理 这里给大家扩展一下nuget的国内源(https://nuget.cdn.azure.cn/v3/index.json) 然后搜自己想要的依赖性,比如CommunityToolkit.Mvvm 再点…

学历太低,可以学这5个技术,不但好找工作,工资也挺高的!

前言 我今年23岁,勉强把高中上完了。 大家都说上高中的时候非常辛苦,但在我看来,却不是这样的。 因为那时候根本就没有,把精力放在学习上面,而是经常出去泡网吧。 没办法,一个班级里面,大多…

《苍穹外卖》知识梳理6-缓存商品,购物车功能

苍穹外卖实操笔记六—缓存商品,购物车功能 一.缓存菜品 可以使用redis进行缓存;另外,在实现缓存套餐时可以使用spring cache提高开发效率;   通过缓存数据,降低访问数据库的次数; 使用的缓存逻辑&#…

【STM32 CubeMX】SPI_Flash_W25Q64的操作方法

文章目录 前言一、W25Q64操作方法基本概念1.1 读数据1.2 写使能1.3 读状态1.4 擦除扇区1.5 烧写页 总结 前言 在嵌入式系统开发中,使用外部 SPI Flash 存储器可以为 STM32 微控制器提供额外的存储空间,以存储程序代码、配置数据等。W25Q64 是一款常见的…

洛谷P8627 饮料换购 题解

#题外话(第27篇题解)(本题为普及-难度) #先看题目 题目链接https://www.luogu.com.cn/problem/P8627 #思路(用while循环,循环到山穷水尽为止,用一个计数的计量) #代码 #include …

Linux系统——防火墙Firewalld

目录 一、firewalld介绍 1.归入zone顺序 2.firewalld zone分类 3.预定义服务 二、图形化操作 1.打开firewalld图形化界面 2.以http服务为例,打开httpd服务 3.修改端口号 三、命令行配置 1.基础配置 2.查看现有firewalld设置 3.设置查看默认区 4.添加源…

软考-系统集成项目管理中级-信息系统集成与服务管理

本章重要知识点 信息系统集成是指将计算机软件、硬件、网络通信、信息安全等技术和产品集成为能够满足用户特定需求的信息系统。 信息系统的生命周期可以分为立项、开发、运维及消亡四个阶段。 系统的运行维护可分为: 1、更正性维护:更正交付后发现的错误; 2、适应性维护:使…

【第三十六节】工程与模块管理

IDEA 项目结构 层级关系: project(工程)-module(模块)-package(包)-class(类) 具体的: 一个project中可以创建多个module 一个module可以创建多个package 一个package中可以创…

Linux下HTTP隧道技术的应用场景与优势分析

亲爱的Linux侠们,今天我们来聊一聊Linux下HTTP隧道技术的应用场景与优势。在这个网络时代,HTTP隧道技术就如同一位神秘的“魔法师”,为我们解决了许多棘手的网络问题。 首先,让我们来看看HTTP隧道技术在哪些场景下能大展身手。 …

OpenGL学习——14.投光物_点光源

前情提要:本文代码源自Github上的学习文档“LearnOpenGL”,我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动,一切著作权归原作者所有,本文仅供学习交流,如有侵权,请联系我删除。L…

C++ 多起点的bfs(五十九)【第六篇】

今天我们来学习多起点的bfs 1.多起点的bfs 在普通的广度优先搜索问题中,为了得到从初始状态到达目标状态的最小操作数,则将初始状态放入队列中。离初始状态由近及远地不断扩展出新的状态,直到搜索到目的状态,或队列为空&#xff…

using--派生类引用基类成员

派生类中using前置声明使用基类成员 using可以用于在派生类中声明需要使用的基类的成员。 这种语法只能在有继承关系的类的派生类中使用,不能在无关的类之间使用。 因为C语法默认在一个类A中使用using引用另一个类B的成员,则A一定继承B;如果没有继承关…

向表中插入数据(单行/多行/插入否则更新/插入否则替换)

目录 插入单行数据 指定属性 省略属性列 多行插入 插入否则更新 格式 on duplicate key含义 不同行数的更改 示例 查看影响行数 语法 插入否则替换 格式 不同行数的更改 示例 插入单行数据 insert into 表名 ( (属性列名) ) values (数据) 指定属…

GAN:“左右互搏”的卷积网络,不断优化性能中

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在一个名为“卷王”的世界里,有一个传奇般的存在——生成对抗网络&#xff…

West-wild

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-04 14:45 CST Nmap scan report for 192.168.1.1 Host is up (0.00063s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report …

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(6)特征工程初步

特征工程是一个非常重要的概念,从特征工程可以领会到机器学习的真谛。 特征工程就是从原始数据转换为特征向量的过程。 特征工程的特点: 特征工程是机器学习中很重要的起始步骤,直接影响效果,需要大量的时间。 数据和特征决定了…

计算机设计大赛 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习YOLO抽烟行为检测 该项目较为新颖,适合作为竞赛课…

java面试微服务篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…