深度学习篇---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'):breakexcept 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’ 键退出程序。


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

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

相关文章

JavaScript DOM与元素操作

目录 DOM 树、DOM 对象、元素操作 一、DOM 树与 DOM 对象 二、获取 DOM 元素 1. 基础方法 2. 现代方法(ES6) 三、修改元素内容 四、修改元素常见属性 1. 标准属性 2. 通用方法 五、通过 style 修改样式 六、通过类名修改样式 1. className 属…

单元测试的编写

Python 单元测试示例 在 Python 中,通常使用 unittest 模块来编写单元测试。以下是一个简单的示例: 示例代码:calculator.py # calculator.py def add(a, b):return a bdef subtract(a, b):return a - b 单元测试代码:test_c…

大模型学习:从零到一实现一个BERT微调

目录 一、准备阶段 1.导入模块 2.指定使用的是GPU还是CPU 3.加载数据集 二、对数据添加词元和分词 1.根据BERT的预训练,我们要将一个句子的句头添加[CLS]句尾添加[SEP] 2.激活BERT词元分析器 3.填充句子为固定长度 代码解释: 三、数据处理 1.…

10组时尚复古美学自然冷色调肖像电影照片调色Lightroom预设 De La Mer – Nautical Lightroom Presets

De La Mer 预设系列包含 10 种真实的调色预设,适用于肖像、时尚和美术。为您的肖像摄影带来电影美学和个性! De La Mer 预设非常适合专业人士和业余爱好者,可在桌面或移动设备上使用,为您的摄影项目提供轻松的工作流程。这套包括…

SDL多窗口多线程渲染技术解析

SDL多窗口多线程渲染技术解析 技术原理 SDL多线程模型与窗口管理 SDL通过SDL_Thread结构体实现跨平台线程管理。在多窗口场景中,每个窗口需关联独立的渲染器,且建议遵循以下原则: 窗口与渲染器绑定:每个窗口创建时生成专属渲染器(SDL_CreateRenderer),避免跨线程操作…

QT 跨平台发布指南

一、Windows 平台发布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 应用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 库 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…

L2-037 包装机 (分数25)(详解)

题目链接——L2-037 包装机 问题分析 这个题目就是模拟了物品在传送带和筐之间的传送过程。传送带用队列模拟,筐用栈模拟。 输入 3 4 4 GPLT PATA OMSA 3 2 3 0 1 2 0 2 2 0 -1输出 根据上述操作,输出的物品顺序是: MATA样例分析 初始…

机器学习的一百个概念(4)下采样

前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

qt6下配置qopengl

qt部件选择 Qt 6:需要手动选择 Qt Shader Tools 和 Qt 5 Compatibility Module(如果需要兼容旧代码) cmake文件 cmake_minimum_required(VERSION 3.16) # Qt6 推荐最低 CMake 3.16 project(myself VERSION 0.1 LANGUAGES CXX)set(CMAKE_A…

数据安全系列4:密码技术的应用-接口调用的身份识别

传送门 数据安全系列1:开篇 数据安全系列2:单向散列函数概念 数据安全系列3:密码技术概述 什么是认证? 一谈到认证,多数人的反应可能就是"用户认证" 。就是应用系统如何识别用户的身份,直接…

STL之map和set

1. 关联式容器 vector、list、deque、 forward_list(C11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。 关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结…

Vue3 其它API Teleport 传送门

Vue3 其它API Teleport 传送门 在定义一个模态框时,父组件的filter属性会影响子组件的position属性,导致模态框定位错误使用Teleport解决这个问题把模态框代码传送到body标签下

C++练习

1.将File练习题&#xff0c;内部的FILE*描述符&#xff0c;改成int描述符 2。写一个类Fifo管道类。提高难度&#xff0c;什么都不提示。只要求&#xff1a;使用自己编写的Fifo类对象&#xff0c;实现2个终端之间互相聊天 file.cpp #include <iostream> #include <c…

《Python Web网站部署应知应会》No4:基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)

基于Flask的调用AI大模型的高性能博客网站的设计思路和实战&#xff08;上&#xff09; 摘要 本文详细探讨了一个基于Flask框架的高性能博客系统的设计与实现&#xff0c;该系统集成了本地AI大模型生成内容的功能。我们重点关注如何在高并发、高负载状态下保持系统的高性能和…

实现一个简易版的前端监控 SDK

【简易版的前端监控系统】 1、Promise的错误如何监控&#xff1f;–promise不是所有都是接口请求 2、接口的报错如何监控&#xff1f;–全局监控sdk&#xff0c;不改动公共的请求方法、不改动业务代码&#xff1b;一般接口使用axios请求 3、资源的报错如何监控&#xff1f; 4、…

【操作系统】软中断vs硬中断

在操作系统中&#xff0c;中断&#xff08;Interrupt&#xff09; 是 CPU 响应外部事件的重要机制&#xff0c;分为 硬中断&#xff08;Hardware Interrupt&#xff09; 和 软中断&#xff08;Software Interrupt&#xff09;。它们的核心区别在于 触发方式 和 处理机制。 1. 硬…

力扣刷题-热题100题-第27题(c++、python)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表&#xff0c;遍历list1与list2&#xff0c;将新链表指向list1与list2…

Python包下载路径 Chrome用户数据 修改到非C盘

查看 site-packages 是否能通过命令行完成&#xff1f; 可以&#xff0c;使用以下命令&#xff08;不需写脚本&#xff09;&#xff1a; python -m site输出包含&#xff1a; sys.path site-packages 路径&#xff08;全局和用户级&#xff09; 如果只想看安装路径&#…

【鸿蒙5.0】鸿蒙登录界面 web嵌入(隐私页面加载)

在鸿蒙应用中嵌入 Web 页面并加载隐私页面&#xff0c;可借助 WebView 组件来实现。以下是一个完整示例&#xff0c;展示如何在鸿蒙 ArkTS 里嵌入 Web 页面并加载隐私政策页面。 在 HarmonyOS 应用开发中&#xff0c;如果你希望嵌入一个网页&#xff0c;并且特别关注隐私页面加…

AI加Python的文本数据情感分析流程效果展示与代码实现

本文所使用数据来自于梯田景区评价数据。 一、数据预处理 数据清洗 去除重复值、空值及无关字符(如表情符号、特殊符号等)。 提取中文文本,过滤非中文字符。 统一文本格式(如全角转半角、繁体转简体)。 中文分词与去停用词 使用 jieba 分词工具进行分词。 加载自定义词…