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

深度学习篇---paddleocr正则化提取


文章目录

  • 前言
  • 一、代码总述&介绍
    • 1.1导入必要的库
      • 1.1.1cv2
      • 1.1.2re
      • 1.1.3paddleocr
    • 1.2初始化PaddleOCR
    • 1.3打开摄像头
    • 1.4使用 PaddleOCR 进行识别
    • 1.5定义正则表达式模式
    • 1.6打印提取结果
    • 1.7异常处理
  • 二、正则表达式
    • 2.1简介
    • 2.2常用正则表达式模式及原理
      • 2.2.1. 快递单号模式
      • 2.2.2. 手机号模式
      • 2.2.3. 姓名模式
    • 2.3正则表达式的使用原理


前言

本文简单介绍了paddleocr中使用的到的正则化。


一、代码总述&介绍

import cv2
import re
from paddleocr import PaddleOCR

# 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")

# 打开摄像头
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("无法打开摄像头")
    exit()

try:
    while True:
        # 读取摄像头帧
        ret, frame = cap.read()
        if not ret:
            print("无法获取帧,退出...")
            break

        # 使用 PaddleOCR 进行识别
        result = ocr.ocr(frame, cls=True)

        text = ""
        for line in result:
            for word_info in line:
                text += word_info[1][0] + " "

        # 定义正则表达式模式
        # 快递单号:通常是数字和字母的组合,长度可能在 10 到 20 位左右
        express_pattern = r'[A-Za-z0-9]{10,20}'
        # 手机号:以 1 开头,后面跟 10 位数字
        phone_pattern = r'1\d{10}'
        # 姓名:简单假设为 2 到 4 个汉字
        name_pattern = r'[\u4e00-\u9fa5]{2,4}'

        # 查找匹配项
        express_numbers = re.findall(express_pattern, text)
        phone_numbers = re.findall(phone_pattern, text)
        names = re.findall(name_pattern, text)

        # 打印提取结果
        print("快递单号:", express_numbers)
        print("手机号:", phone_numbers)
        print("姓名:", names)

        # 显示帧
        cv2.imshow('Camera Feed', frame)

        # 按 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

except Exception as e:
    print(f"发生错误: {e}")
finally:
    # 释放摄像头并关闭窗口
    cap.release()
    cv2.destroyAllWindows()

1.1导入必要的库

python
import cv2
import re
from paddleocr import PaddleOCR

1.1.1cv2

import cv2:导入 OpenCV 库,它是一个广泛用于计算机视觉任务的库,这里主要用于摄像头操作和图像显示

1.1.2re

import re:导入 Python 的 re 模块,用于进行正则表达式匹配,方便从识别出的文本中提取特定信息

1.1.3paddleocr

from paddleocr import PaddleOCR:从 paddleocr 库中导入 PaddleOCR 类,用于进行光学字符识别(OCR)。

1.2初始化PaddleOCR

## 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
ocr = PaddleOCR(use_angle_cls=True, lang="ch"):创建一个 PaddleOCR 对象 ocr。use_angle_cls=True 表示启用角度分类功能,能更好地处理不同角度的文字;lang="ch" 表示使用中文进行识别。

1.3打开摄像头

# 打开摄像头
cap = cv2.VideoCapture(0)
------
cap = cv2.VideoCapture(0):使用 cv2.VideoCapture 函数打开默认摄像头(编号为 0),并将返回的视频捕获对象赋值给 cap。
检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()
------
if not cap.isOpened()::检查摄像头是否成功打开。如果 cap.isOpened() 返回 False,说明摄像头未成功打开。
print("无法打开摄像头"):若摄像头未成功打开,打印提示信息。
exit():终止程序运行。
开始循环读取摄像头帧
try:
    while True:
------
try::开启一个异常处理块,用于捕获可能出现的异常。
while True::创建一个无限循环,持续从摄像头读取帧。
读取摄像头帧
        # 读取摄像头帧
        ret, frame = cap.read()
------
ret, frame = cap.read():调用 cap.read() 方法从摄像头读取一帧图像。ret 是一个布尔值,表示是否成功读取到帧;frame 是读取到的图像帧。
检查是否成功读取帧
        if not ret:
            print("无法获取帧,退出...")
            break
------
if not ret::如果 ret 为 False,说明未成功读取到帧。
print("无法获取帧,退出..."):打印提示信息。
break:跳出循环,结束程序。

1.4使用 PaddleOCR 进行识别

 使用 PaddleOCR 进行识别
        result = ocr.ocr(frame, cls=True)
------
result = ocr.ocr(frame, cls=True):调用 ocr.ocr 方法对当前帧 frame 进行 OCR 识别,cls=True 表示启用角度分类。识别结果存储在 result 中。
提取识别到的文本
        text = ""
        for line in result:
            for word_info in line:
                text += word_info[1][0] + " "
------
text = "":初始化一个空字符串 text,用于存储识别到的所有文本。
for line in result::遍历识别结果 result 中的每一行。
for word_info in line::遍历每一行中的每个单词信息。
text += word_info[1][0] + " ":将每个单词的文本内容添加到 text 中,并在后面添加一个空格。

1.5定义正则表达式模式

      # 定义正则表达式模式
        # 快递单号:通常是数字和字母的组合,长度可能在 10 到 20 位左右
        express_pattern = r'[A-Za-z0-9]{10,20}'
        # 手机号:以 1 开头,后面跟 10 位数字
        phone_pattern = r'1\d{10}'
        # 姓名:简单假设为 2 到 4 个汉字
        name_pattern = r'[\u4e00-\u9fa5]{2,4}'
------
express_pattern = r'[A-Za-z0-9]{10,20}':定义快递单号的正则表达式模式,匹配由 1020 位的字母(大小写均可)和数字组成的字符串。
phone_pattern = r'1\d{10}':定义手机号的正则表达式模式,匹配以数字 1 开头,后面跟 10 位数字的字符串。
name_pattern = r'[\u4e00-\u9fa5]{2,4}':定义姓名的正则表达式模式,匹配由 24 个中文字符组成的字符串。
查找匹配项
        # 查找匹配项
        express_numbers = re.findall(express_pattern, text)
        phone_numbers = re.findall(phone_pattern, text)
        names = re.findall(name_pattern, text)
------
express_numbers = re.findall(express_pattern, text):使用 re.findall 方法在 text 中查找所有匹配快递单号模式的字符串,并将结果存储在 express_numbers 列表中。
phone_numbers = re.findall(phone_pattern, text):同理,查找所有匹配手机号模式的字符串,存储在 phone_numbers 列表中。
names = re.findall(name_pattern, text):查找所有匹配姓名模式的字符串,存储在 names 列表中。

1.6打印提取结果

      # 打印提取结果
        print("快递单号:", express_numbers)
        print("手机号:", phone_numbers)
        print("姓名:", names)
------
分别打印提取到的快递单号、手机号和姓名列表。
显示帧
        # 显示帧
        cv2.imshow('Camera Feed', frame)
cv2.imshow('Camera Feed', frame):使用 cv2.imshow 函数显示当前帧,窗口标题为 Camera Feed。
按 'q' 键退出循环
        # 按 'q' 键退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
------
cv2.waitKey(1):等待 1 毫秒,检测是否有按键事件。
cv2.waitKey(1) & 0xFF == ord('q'):检查按下的键是否为 'q'。如果是,则跳出循环。

1.7异常处理

except Exception as e:
    print(f"发生错误: {e}")
------
except Exception as e::捕获所有异常,并将异常对象赋值给 e。
print(f"发生错误: {e}"):打印错误信息。
释放摄像头并关闭窗口
finally:
    # 释放摄像头并关闭窗口
    cap.release()
    cv2.destroyAllWindows()
------
finally::无论是否发生异常,都会执行 finally 块中的代码。
cap.release():释放摄像头资源。
cv2.destroyAllWindows():关闭所有由 OpenCV 创建的窗口。

二、正则表达式

2.1简介

正则表达式是一种用于匹配字符串模式的工具,在处理文本数据时非常有用。

2.2常用正则表达式模式及原理

2.2.1. 快递单号模式

express_pattern = r'[A-Za-z0-9]{10,20}'

原理剖析:
[A-Za-z0-9]:这是一个字符类,它表示匹配方括号内任意一个字符。A-Z 代表所有大写字母,a-z 代表所有小写字母,0-9 代表所有数字。所以这个字符类可以匹配任意一个字母(大小写均可)或者数字。
{10,20}:这是一个量词,它规定了前面字符类(也就是 [A-Za-z0-9])出现的次数范围。{10,20} 表示前面的字符类至少出现 10 次,最多出现 20 次。
综合起来,[A-Za-z0-9]{10,20} 可以匹配由 10 到 20 位字母(大小写均可)和数字组成的字符串,比较符合常见快递单号的特征。

2.2.2. 手机号模式

phone_pattern = r'1\d{10}'

原理剖析:
1:这是一个普通字符,它直接匹配字符 1。在中国,手机号码都是以数字 1 开头的。
\d:这是一个元字符,它代表任意一个数字,等价于 [0-9]。
{10}:这是一个量词,它规定了前面的 \d 必须出现 10 次。
综合起来,1\d{10} 可以匹配以数字 1 开头,后面跟着 10 位数字的字符串,符合中国手机号码的格式。

2.2.3. 姓名模式

name_pattern = r'[\u4e00-\u9fa5]{2,4}'

原理剖析:
[\u4e00-\u9fa5]:这是一个字符类,\u4e00 到 \u9fa5 是 Unicode 编码中汉字的范围,所以这个字符类可以匹配任意一个中文字符。
{2,4}:这是一个量词,它规定了前面的字符类(也就是 [\u4e00-\u9fa5])至少出现 2 次,最多出现 4 次。
综合起来,[\u4e00-\u9fa5]{2,4} 可以匹配由 2 到 4 个中文字符组成的字符串,简单模拟了常见姓名的长度。

2.3正则表达式的使用原理

在 Python 里,re 模块提供了正则表达式的支持。常用的函数有 re.findall、re.search、re.match 等。在你的代码中,使用了 re.findall 函数:

express_numbers = re.findall(express_pattern, text)
phone_numbers = re.findall(phone_pattern, text)
names = re.findall(name_pattern, text)

re.findall(pattern, string):该函数会在 string 中查找所有匹配 pattern 的子字符串,并将它们作为一个列表返回。例如,re.findall(express_pattern, text) 会在 text 中查找所有符合 express_pattern 模式的子字符串,然后把这些子字符串组成一个列表赋值给 express_numbers。
正则表达式的匹配过程通常是从字符串的开头开始,依次尝试匹配模式。如果匹配成功,就记录下匹配的子字符串,然后继续从匹配结束的位置往后匹配,直到字符串结束。

综上所述,这段代码实现了从摄像头实时读取帧,使用 PaddleOCR 进行文字识别,并通过正则表达式提取快递单号、手机号和姓名的功能。用户可以通过按 ‘q’ 键退出程序。


相关文章:

  • 系统如何查找文件?inode号又是什么?
  • 0 基础速成 AI 编程指南
  • Vue 项目中使用$refs来访问组件实例或 DOM 元素,有哪些注意事项?
  • 基础认证-判断题
  • NX二次开发刻字功能——拉伸功能
  • 【质量管理】防错(POKA-YOKE)的概念、特点和作用解析
  • 如何降低频谱分析仪的底噪
  • 并查集解题记录128最长连续序列200岛屿数量547省份数量684冗余连接
  • 【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比
  • 青少年编程与数学 02-011 MySQL数据库应用 19课题、存储引擎
  • 第三卷:覆舟山决战(85-108回)
  • 环境试验中温湿度循环测试的常见盲区分析
  • 第38周:文献阅读
  • kafka 4.x docker启动kafka4.0.0 docker-compose启动最新版kafka 如何使用docker容器启动最新版kafka
  • 步进电机 cia402协议 报文自己的理解 (笔记)
  • 怎么在一台服务器上配置两套不同的前后端分离系统
  • Docker 环境安装步骤
  • 《初级社会工作者》考试题,附答案解析
  • 蓝桥杯16天刷题计划一一Day01
  • 2007-2019年各省地方财政一般公共服务支出数据
  • jsp的网站/郑州企业网站优化排名
  • 东坑网站建设/饥饿营销的十大案例
  • 做h5小游戏的网站有哪些/5g网络优化工程师
  • 北京网站建设网页设计/百度搜索关键词优化
  • 网站建设有什么用/网络广告策划案