opencv-python识别二维码并判断内容

在本篇博客中,我们将探讨如何使用Python、OpenCV库和pyzbar库在Ubuntu 20.04环境下识别二维码。这个过程不仅包括识别二维码,还增加了对特定二维码内容的判断逻辑。我们将通过安装必要的库、编写代码,并解释每一段代码的作用和功能,来一步步实现这一目标。

一、准备工作

首先,确保你的系统中已经安装了Python3.8。Python是一种广泛使用的高级编程语言,适用于多种编程和脚本任务。Ubuntu 20.04通常自带Python3,但你可以通过终端命令`python3 --version`来检查其版本。

接下来,你需要安装OpenCV和pyzbar库。OpenCV是一个开源的计算机视觉和机器学习软件库,而pyzbar是一个用于识别条形码和二维码的库。由于pyzbar是基于zbar的,而zbar不支持Python3,因此我们选择pyzbar作为我们的解决方案。安装这些库的命令如下:

pip3 install pyzbar

准备二维码图片

你可以使用任何二维码生成器在线生成二维码,例如草料二维码生成器: 草料二维码生成器。生成后,可以打印在纸上或保存在手机中供程序扫描。

二、编写代码

打开你的Python开发环境,创建一个新的文件,命名为`ercode.py`,然后输入以下代码:

python 复制代码
# -*- coding:utf-8 --*-
import cv2
import pyzbar.pyzbar as pyzbar

def decodeDisplay(video):
    # 转为灰度图像
    gray = cv2.cvtColor(video, cv2.COLOR_BGR2GRAY)
    barcodes = pyzbar.decode(gray)
    for barcode in barcodes:
        # 提取二维码的位置, 然后用边框标识出来在视频中
        (x, y, w, h) = barcode.rect
        cv2.rectangle(video, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 字符串转换
        barcodeData = barcode.data.decode("utf-8")
        barcodeType = barcode.type
        # 判断二维码内容
        if barcodeData == "car1":
            print("二维码内容匹配成功!")
        else:
            print("二维码内容不匹配。")
        # 在图像上面显示识别出来的内容
        text = "{}".format(barcodeData)
        cv2.putText(video, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,1, (0, 255, 0), 2)
        # 打印识别后的内容
        print("[扫描结果] 二维码类别: {0} 内容: {1}".format(barcodeType, barcodeData))
    cv2.imshow("cam", video)

def detect():
    cv2.namedWindow("cam",cv2.WINDOW_NORMAL)
    cam = cv2.VideoCapture(0)
    while True:
        # 读取当前帧
        ret, frame = cam.read()
        decodeDisplay(frame)
        # 按ESC键退出
        if(cv2.waitKey(5)==27):
            break
    cam.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    detect()

三、代码解释

  • 导入库:首先,我们导入必要的库,包括`cv2`(OpenCV)和`pyzbar.pyzbar`。

  • 函数`decodeDisplay`:这个函数负责处理摄像头捕获的每一帧。它首先将图像转换为灰度图,以简化处理过程并提高识别速率。然后,使用`pyzbar.decode`函数识别图中的二维码。对于每个识别到的二维码,我们使用OpenCV的`rectangle`方法在图像上绘制一个绿色的框以标识它的位置。接下来,我们解码二维码内容并判断是否匹配预设的"car1"。如果匹配,程序会打印出相应的匹配成功信息。

  • 函数`detect`:此函数初始化摄像头,并不断读取摄像头的帧,对每一帧调用`decodeDisplay`函数进行处理。当用户按下ESC键时,循环会终止,摄像头会被释放,关闭所有OpenCV窗口。

详细解释和修改

摄像头和图像处理

使用OpenCV访问和处理来自摄像头的视频流是本脚本的核心。首先,我们通过`cv2.VideoCapture(0)`初始化摄像头(0代表默认摄像头)。然后,在`detect`函数的循环中,使用`cam.read()`不断读取当前帧。每读取一帧,就调用`decodeDisplay`函数进行处理。

在`decodeDisplay`函数中,第一步是将图像转换成灰度图(`cv2.cvtColor(video, cv2.COLOR_BGR2GRAY)`),因为灰度图处理起来更快,而且对于条码和二维码识别来说是足够的。

二维码识别和解码

使用pyzbar库进行二维码识别和解码是非常直接的。调用`pyzbar.decode(gray)`后,会返回一个列表,包含图像中所有识别到的条码和二维码。每个识别到的对象都有位置信息(`rect`)和数据(`data`)。我们遍历这个列表,对每一个条码或二维码进行处理。

添加内容匹配条件

对每个识别到的二维码,我们通过`.decode("utf-8")`方法将其数据解码为字符串,然后判断这个字符串是否为"car1"。如果是,我们打印出匹配成功的信息。这个简单的逻辑增强了脚本的功能,使其不仅能识别二维码,还能对特定内容做出反应。

四、结论

通过本教程,我们展示了如何使用Python、OpenCV和pyzbar库来识别和处理二维码。通过对代码的解释和修改,我们增加了对特定二维码内容的判断逻辑,这展示了如何将这些技术应用于实际问题中。无论是在零售、物流还是其他需要快速识别物品信息的领域,本教程提供的方法都是一种有效的解决方案。

相关推荐
IT_陈寒3 小时前
React 18实战:7个被低估的Hooks技巧让你的开发效率提升50%
前端·人工智能·后端
数据智能老司机4 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
逛逛GitHub4 小时前
飞书多维表“独立”了!功能强大的超出想象。
人工智能·github·产品
机器之心4 小时前
刚刚,DeepSeek-R1论文登上Nature封面,通讯作者梁文锋
人工智能·openai
数据智能老司机5 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机5 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机5 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i5 小时前
drf初步梳理
python·django
每日AI新事件5 小时前
python的异步函数
python
这里有鱼汤6 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python