使用 OpenCV 和 Pyzbar 检测二维码和条码

news2024/11/8 14:17:01
概述

在现代社会,二维码和条码的应用非常广泛,从商品标签到支付二维码,几乎无处不在。本文将详细介绍如何使用 OpenCV 和 Pyzbar 库在 Python 中检测并识别二维码和条码,并通过具体的代码示例来展示整个过程。

环境准备

在开始之前,请确保已经安装了所需的库。可以通过以下命令进行安装:

pip install opencv-python pyzbar
完整示例代码详解
import cv2
import numpy as np
from pyzbar import pyzbar

class CodeFinder:
    """
    二维码、条码检测
    """
    def __init__(self):
        """
        初始化摄像头并设置分辨率
        """
        self.cap = cv2.VideoCapture(0)  # 打开默认摄像头
        self.cap.set(3, 640)  # 设置视频宽度为640像素
        self.cap.set(4, 480)  # 设置视频高度为480像素

    def run(self):
        """
        捕获视频并检测二维码和条码
        """
        while True:
            success, img = self.cap.read()  # 读取一帧视频
            if not success:
                print("Failed to read frame")
                break

            # 检测图像中的二维码和条码
            for bar_code in pyzbar.decode(img):
                # 解码二维码数据
                print(bar_code.data.decode('utf8'))  # 打印二维码数据
                print(bar_code.type)  # 打印二维码类型
                print(bar_code.rect)  # 打印二维码四周边界(矩形框)
                print(bar_code.polygon)  # 打印二维码多边形边框
                print(bar_code.quality)  # 打印二维码质量
                print(bar_code.orientation)  # 打印二维码方向

                # 绘制二维码边界
                points = np.array(bar_code.polygon, np.int32)
                points = points.reshape((-1, 1, 2))
                cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)

                # 在图像上显示二维码数据
                cv2.putText(
                    img=img,
                    text=bar_code.data.decode('utf8'),
                    org=(bar_code.rect.left, bar_code.rect.top),
                    fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                    fontScale=0.8,
                    color=(0, 0, 255),
                    thickness=2
                )

            # 显示图像
            cv2.imshow('code', img)

            # 按下 'q' 键退出循环
            if cv2.waitKey(1) & 0xFF == ord('q'):
                self.cap.release()  # 释放摄像头资源
                cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
                break

if __name__ == '__main__':
    code_finder = CodeFinder()
    code_finder.run()
代码解析
1. 导入必要的库
import cv2
import numpy as np
from pyzbar import pyzbar
  • cv2:OpenCV 的 Python 接口,用于图像和视频处理。
  • numpy:用于处理图像数据的数组。
  • pyzbar:用于解码二维码和条码的库。
2. 定义 CodeFinder
class CodeFinder:
    """
    二维码、条码检测
    """
    def __init__(self):
        """
        初始化摄像头并设置分辨率
        """
        self.cap = cv2.VideoCapture(0)  # 打开默认摄像头
        self.cap.set(3, 640)  # 设置视频宽度为640像素
        self.cap.set(4, 480)  # 设置视频高度为480像素
  • 初始化摄像头
    • self.cap = cv2.VideoCapture(0):打开默认摄像头(ID 为 0)。
    • self.cap.set(3, 640):设置视频宽度为 640 像素。
    • self.cap.set(4, 480):设置视频高度为 480 像素。
3. 定义 run 方法
def run(self):
    """
    捕获视频并检测二维码和条码
    """
    while True:
        success, img = self.cap.read()  # 读取一帧视频
        if not success:
            print("Failed to read frame")
            break

        # 检测图像中的二维码和条码
        for bar_code in pyzbar.decode(img):
            # 解码二维码数据
            print(bar_code.data.decode('utf8'))  # 打印二维码数据
            print(bar_code.type)  # 打印二维码类型
            print(bar_code.rect)  # 打印二维码四周边界(矩形框)
            print(bar_code.polygon)  # 打印二维码多边形边框
            print(bar_code.quality)  # 打印二维码质量
            print(bar_code.orientation)  # 打印二维码方向

            # 绘制二维码边界
            points = np.array(bar_code.polygon, np.int32)
            points = points.reshape((-1, 1, 2))
            cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3)

            # 在图像上显示二维码数据
            cv2.putText(
                img=img,
                text=bar_code.data.decode('utf8'),
                org=(bar_code.rect.left, bar_code.rect.top),
                fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                fontScale=0.8,
                color=(0, 0, 255),
                thickness=2
            )

        # 显示图像
        cv2.imshow('code', img)

        # 按下 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            self.cap.release()  # 释放摄像头资源
            cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
            break
  • 读取视频帧

    • success, img = self.cap.read():读取一帧视频。success 表示是否成功读取,img 是读取到的图像。
    • 如果读取失败,打印错误信息并退出循环。
  • 检测二维码和条码

    • for bar_code in pyzbar.decode(img):使用 pyzbar.decode() 函数检测图像中的二维码和条码。
    • print(bar_code.data.decode('utf8')):打印二维码数据。
    • print(bar_code.type):打印二维码类型。
    • print(bar_code.rect):打印二维码四周边界(矩形框)。
    • print(bar_code.polygon):打印二维码多边形边框。
    • print(bar_code.quality):打印二维码质量。
    • print(bar_code.orientation):打印二维码方向。
  • 绘制二维码边界

    • points = np.array(bar_code.polygon, np.int32):将二维码多边形边框转换为 NumPy 数组。
    • points = points.reshape((-1, 1, 2)):重塑数组形状。
    • cv2.polylines(img=img, pts=[points], isClosed=True, color=(0, 0, 255), thickness=3):使用 cv2.polylines() 函数绘制多边形边框。
  • 在图像上显示二维码数据

    • cv2.putText():在图像上显示二维码数据。
    • text=bar_code.data.decode('utf8'):要显示的文本内容。
    • org=(bar_code.rect.left, bar_code.rect.top):文本的起始位置。
    • fontFace=cv2.FONT_HERSHEY_SIMPLEX:使用的字体类型。
    • fontScale=0.8:字体大小。
    • color=(0, 0, 255):文本颜色。
    • thickness=2:文本线宽。
  • 显示图像

    • cv2.imshow('code', img):显示图像。
  • 按键检测

    • if cv2.waitKey(1) & 0xFF == ord('q'):等待1毫秒,如果有按键按下,返回按键的ASCII码。ord('q') 返回字符 ‘q’ 的ASCII码。如果按键为 ‘q’,则退出循环。
    • self.cap.release():释放摄像头资源。
    • cv2.destroyAllWindows():关闭所有OpenCV窗口。
4. 主函数
if __name__ == '__main__':
    code_finder = CodeFinder()
    code_finder.run()
  • 主函数
    • if __name__ == '__main__'::确保当脚本直接运行时才执行以下代码。
    • 创建 CodeFinder 对象并调用 run 方法来启动二维码和条码检测。
总结

本文详细介绍了如何使用 OpenCV 和 Pyzbar 库在 Python 中检测并识别二维码和条码,并通过具体的代码示例展示了整个过程。通过使用 cv2.VideoCapture()pyzbar.decode()cv2.polylines()cv2.putText() 等函数,我们可以轻松地处理视频流中的二维码和条码数据。


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

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

相关文章

(蓝桥杯C/C++)——基础算法(下)

目录 一、时空复杂度 1.时间复杂度 2.空间复杂度 3.分析技巧 4.代码示例 二、递归 1.递归的介绍 2.递归如何实现 3.递归和循环的比较 4.代码示例 三、差分 1.差分的原理和特点 2.差分的实现 3.例题讲解 四、枚举 1.枚举算法介绍 2.解空间的类型 3. 循环枚举解…

7.5 inch电力线载波通信技术

7.5寸电子桌牌 产品型号 PE75R_D_W 尺寸 176.2*137.15*80mm 屏幕尺寸 7.5 inch 显示区域(mm) 163.2(H) * 97.92(V) 分辨率 800*480 显示技术 电子墨水屏双面显示 显示颜色 黑/白/红 外观颜色 银色 工作温度 0-40℃ 视角 180 支持内容格式 文本/图片/二维码…

Linux下的ADC

ADC ADC简介 ADC是 Analog Digital Converter 的缩写,翻译过来为模数转换器,ADC可以将模拟值转换成数字值。模拟值是什么呢?比如我们日常生活中的温度,速度,湿度等等都是模拟值。所以如果我们想测量这些模拟值的值是多少&#x…

星空天文 2.0.1| 完全免费的观星软件,无注册登录,天文爱好者必备。

星空天文是一款完全免费且功能强大的观星软件,适用于安卓平台。无需注册登录即可使用,界面设计精美且操作简单。软件支持AR实景模式,可以将实景与星空结合,增强观星体验。用户可以设定任意日期和时间来观察不同时段的天空&#xf…

书生大模型实战营第四期-入门岛-1. Linux前置基础

入门岛-Linux前置基础 书生大模型实战营-第四期-Linux前置基础: 任务:https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/linux/task.md 文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux 任务描述完成所需时…

JavaEE初阶--servlet篇(三)HttpServlet/response/request对应方法使用

文章目录 1.总括说明2.httpservlet父类2.1方法介绍2.2dopost方法的演示2.3doput方法的演示 3.HttpServletRequest类3.1方法说明3.2方法使用演示3.3getparameter方法使用3.4使用form表单的方式3.5jackson获取参数 4.HttpResponse类4.1设置状态码4.2自动进行刷新4.3重定向跳转4.3…

前后端分离,Jackson,Long精度丢失

案例:后端接口放回一个Long数据 GetMapping("/testForLong")public Map<String, Object> testForLong() {Map<String, Object> map new HashMap<>();map.put("aaa", 1234567890123456789L);return map;}实际前端接收的数据 前后端数据…

记某单位众测项目漏洞挖掘中的一些手法

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 一个想当文人的黑客 &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【edusrc漏洞挖掘】 【VulnHub靶场复现】【面试分析】 &#x1f389;欢迎…

用 Python 写了一个天天酷跑(附源码)

Hello&#xff0c;大家好&#xff0c;给大家说一下&#xff0c;我要开始装逼了 这期写个天天酷跑玩一下叭&#xff01; 制作一个完整的“天天酷跑”游戏涉及很多方面&#xff0c;包括图形渲染、物理引擎、用户输入处理、游戏逻辑等。由于Python是一种高级编程语言&#xff0c;…

芯片设计公司ERP系统如何实现一体化管理

在当今高科技迅猛发展的时代&#xff0c;芯片设计行业作为信息技术的核心&#xff0c;正面临着日益激烈的市场竞争和复杂多变的市场需求。为了提升企业的运营效率和市场竞争力&#xff0c;芯片设计公司纷纷引入ERP(企业资源计划)系统&#xff0c;以实现一体化管理。接下来我们跟…

50岁+人群月活超1亿,短剧迎来新对手,小程序游戏“收割”中老年

抢夺中老年流量&#xff1a;微短剧向左&#xff0c;小游戏向右 作者&#xff5c;AgeClub 干货抢先看 1.《黑神话&#xff1a;悟空》走红&#xff0c;吸引大量玩家入坑单机市场。与硬核单机游戏不同&#xff0c;在渗透率更高的小游戏领域&#xff0c;聚集了更多“网瘾”中老年…

手机如何打开chm文件

chm文件一般是帮助文档&#xff0c;手机一般不能直接打开&#xff0c;我们可以通过下载阅读器来打开 以荣耀手机为例 首先下载掌阅iReaderAPP 下载完成后打开掌阅 点击书架&#xff0c;右上角本机导入 搜索你下载的chm文件的名字 勾选&#xff0c;加入书架(应该保留目录) 在书…

《重学Java设计模式》之 工厂方法模式

《重学Java设计模式》之 建造者模式 《重学Java设计模式》之 原型模式 《重学Java设计模式》之 单例模式 模拟发奖多种商品 工程结构 奖品发放接口 package com.yys.mes.design.factory.store;public interface ICommodity {/*** Author Sherry* Date 14:20 2024/11/6**/voi…

【算法与数据结构】【链表篇】【题1-题5】

题1.从尾到头打印链表 题目&#xff1a;输入一个链表的头结点&#xff0c;从尾到头反过来打印出每个节点的值。链表的定义如下&#xff1a; struct ListNode {int mValue;ListNode *mNext;ListNode *mPrev; }; 1.1 方法一&#xff1a;栈 思路&#xff1a;要反过来打印&…

28.医院管理系统(基于springboot和vue)

目录 1.系统的受众说明 2. 相关技术和开发环境 2.1 相关技术 2.1.1 Java语言 2.1.2 HTML、CSS、JavaScript 2.1.3 Redis 2.1.4 MySQL 2.1.5 SSM框架 2.1.6 Vue.js 2.1.7 SpringBoot 2.2 开发环境 3. 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术…

Mysql基础 01 数据与sql

文章目录 一、基本概念二、mysql的常用命令三、sql规范四、数据类型五、SQL语句 一、基本概念 数据库(database,DB)&#xff1a;存储数据的仓库。 数据库管理系统软件(Database Management System,DBMS)&#xff1a;是一种操作和管理数据库的大型软件。常见的DBMS有oracle、s…

爬虫-------字体反爬

目录 一、了解什么是字体加密 二. 定位字体位置 三. python处理字体 1. 工具库 2. 字体读取 3. 处理字体 案例1:起点 案例2:字符偏移: 5请求数据 - 发现偏移量 5.4 多套字体替换 套用模板 版本1 版本2 四.项目实战 1. 采集目标 2. 逆向结果 一、了解什么是…

数据分析:宏基因组DESeq2差异分析筛选差异物种

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍原理:计算步骤:结果:加载R包准备画图主题数据链接导入数据Differential abundance (No BP vs 2BP TA)构建`countData`矩阵过滤低丰度物种构建DESeq数据对象DESeq2差异分析画图Di…

【手撕排序2】快速排序

&#x1f343; 如果觉得本系列文章内容还不错&#xff0c;欢迎订阅&#x1f6a9; &#x1f38a;个人主页:小编的个人主页 &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ✌️ &#x1f91e; &#x1f91f; &#x1f918; &#x1f919; &#x1f448; &…

OpenCV自学系列(1)——简介和GUI特征操作

与另一个计算机视觉系列相对应&#xff0c;本系列主要探索OpenCV的具体操作。 学习资源&#xff1a;官网教程 https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.htmlhttps://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html 所有源码均上传至仓库&#xff1a; http…