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

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


相关文章:

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

文章目录 前言一、代码总述&介绍1.1导入必要的库1.1.1cv21.1.2re1.1.3paddleocr 1.2初始化PaddleOCR1.3打开摄像头1.4使用 PaddleOCR 进行识别1.5定义正则表达式模式1.6打印提取结果1.7异常处理 二、正则表达式2.1简介2.2常用正则表达式模式及原理2.2.1. 快递单号模式2.2.2…...

Android 蓝牙/Wi-Fi通信协议之:低功耗蓝牙(BLE 4.0+)介绍

介绍:蓝牙通信协议详解 1. 蓝牙协议分层 Android主要支持**经典蓝牙(Bluetooth Classic)和低功耗蓝牙(BLE)**两种模式: 经典蓝牙(BT 2.1/3.0) 低功耗蓝牙(BLE 4.0&…...

流影---开源网络流量分析平台(四)(分析引擎部署)

目录 功能介绍 部署过程 一、安装依赖环境 二、源码编译部署 三、运行环境配置 四、运行配置 功能介绍 本章我将继续安装流影的分析引擎组件首先,ly_analyser是流影的威胁行为分析引擎,读取netflow v9格式的数据作为输入,运行各种威胁行…...

31天Python入门——第14天:异常处理

你好,我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…...

浅析Android Jetpack ACC之LiveData

一、Android Jetpack简介 Android官网对Jetpack的介绍如下: Jetpack is a suite of libraries to help developers follow best practices, reduce boilerplate code, and write code that works consistently across Android versions and devices so that develo…...

【区块链安全 | 第十五篇】类型之值类型(二)

文章目录 值类型有理数和整数字面量(Rational and Integer Literals)字符串字面量和类型(String Literals and Types)Unicode 字面量(Unicode Literals)十六进制字面量(Hexadecimal Literals&am…...

深度学习篇---模型训练评估参数

文章目录 前言一、Precision(精确率)1.1定义1.2意义1.3数值接近11.4数值再0.5左右1.5数值接近0 二、Recall(召回率)2.1定义2.2意义2.3数值接近12.4数值在0.5左右2.5数值接近0 三、Accuracy(准确率)3.1定义3…...

SQL Server 可用性组自动种子设定失败问题

目录标题 SQL Server 可用性组自动种子设定失败问题笔记一、问题背景二、错误日志分析错误信息错误代码与分析 三、自动种子设定概述(同上,无需修改)四、解决步骤1. 备份主数据库2. 在辅助副本上恢复数据库3. 重新启动自动种子设定 SQL Serve…...

02 相机标定相关坐标系

标定相关坐标系 一共四个坐标系 图像像素坐标系: u-v,图像左上角为原点图像物理坐标系: x-y,图像中心为原点...

Ubuntu修改用户名

修改用户名: 1.CTRL ALT T 快捷键打开终端,输入‘sudo su’ 转为root用户。 2.输入‘ gredit /etc/passwd ’,修改用户名,只修改用户名,后面的全名、目录等不修改。 3.输入 ‘ gedit /etc/shadow ’ 和 ‘ gedit /etc/…...

Windows 系统下多功能免费 PDF 编辑工具详解

IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…...

UE学习记录part11

第14节 breakable actors 147 destructible meshes a geometry collection is basically a set of static meshes that we get after we fracture a mesh. 几何体集合基本上是我们在断开网格后获得的一组静态网格。 选中要破碎的网格物品,创建集合 可以选择不同的…...

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]: sadd set1 a b c d sadd set1 a 0表示没有添加成功,因为集合中已经有了这个元素了,因此无法重复添加。 SMEMBERS key: smembers set1 SCARD key: scard set1 SADD key member1 …...

vscode 源代码管理

https://code.visualstudio.com/updates/v1_92#_source-control 您可以通过切换 scm.showHistoryGraph 设置来禁用传入/传出更改的图形可视化。...

arm64位FFmpeg与X264库

参考链接: https://blog.csdn.net/gitblog_09700/article/details/142945092...

iOS审核被拒:Missing privacy manifest 第三方库添加隐私声明文件

问题: iOS提交APP审核被拒,苹果开发者网页显示二进制错误,收到的邮件显示的详细信息如下图: 分析: 从上面信息能看出第三方SDK库必须要包含一个隐私文件,去第三方库更新版本。 几经查询资料得知,苹果在…...

用mkdocs写文档#自动更新github-page

https://wuyisheng.github.io/blog 背景是上一篇博客 使用mkdocs,最后提及可以部署github page。这里说明下怎么自动部署。 当然,这篇博客主要的目的还是提供下github page的链接 :) 我是这样做的: step 1: pip3 i…...

【LeetCode Solutions】LeetCode 101 ~ 105 题解

CONTENTS LeetCode 101. 对称二叉树(简单)LeetCode 102. 二叉树的层序遍历(中等)LeetCode 103. 二叉树的锯齿形层序遍历(中等)LeetCode 104. 二叉树的最大深度(简单)LeetCode 105. 从…...

Orpheus-TTS 介绍,新一代开源文本转语音

Orpheus-TTS 是由 Canopy Labs 团队于2025年3月19日发布的开源文本转语音(TTS)模型,其技术突破集中在超低延迟、拟人化情感表达与实时流式生成三大领域。以下从技术架构、核心优势、应用场景、对比分析、开发背景及最新进展等多维度展开深入解…...

Java数据结构-栈和队列

目录 1. 栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 2. 队列(Queue) 2.1 概念 2.2 队列的使用 2.3 队列模拟实…...

MySQL中的CREATE TABLE LIKE和CREATE TABLE SELECT

MySQL中的CREATE TABLE LIKE和CREATE TABLE SELECT CREATE TABLE LIKECREATE TABLE SELECT CREATE TABLE LIKE CREATE TABLE ... LIKE可以用来复制表结构,源表上的索引和约束也会复制。CREATE TABLE ... LIKE不能复制表数据。CREATE TABLE ... LIKE只能复制基表&…...

权重衰减-笔记

《动手学深度学习》-4.5-笔记 权重衰减就像给模型“勒紧裤腰带”,不让它太贪心、不让它学太多。 你在学英语单词,别背太多冷门单词,只背常见的就行,这样考试时更容易拿分。” —— 这其实就是在“限制你学的内容复杂度”。 在…...

Hyperliquid 遇袭「拔网线」、Polymarket 遭治理攻击「不作为」,从双平台危机看去中心化治理的进化阵痛

作者:Techub 热点速递 撰文:Glendon,Techub News 继 3 月 12 日「Hyperliquid 50 倍杠杆巨鲸」引发的 Hyperliquid 清算事件之后,3 月 26 日 晚间,Hyperliquid 再次遭遇了一场针对其流动性和治理模式的「闪电狙击」。…...

软考笔记6——结构化开发方法

第六章节——结构化开发方法 结构化开发方法 第六章节——结构化开发方法一、系统分析与设计概述1. 系统分析概述2. 系统设计的基本原理3. 系统总体结构设计 二、结构化分析方法1. 结构化分析方法概述2. 数据流图(DFD)3. 数据字典 三、结构化设计方法(了解&#xff…...

一种C# Winform的UI处理

效果 圆角 阴影 突出按钮 说明 这是一种另类的处理,不是多层窗口 也不是WPF 。这种方式的特点是比较简单,例如圆角、阴影、按钮等特别容易修改过。其实就是html css DirectXForm。 在VS中如下 圆角和阴影 然后编辑这个窗体的Html模板&#xff0c…...

java笔记02

运算符 1.隐式转换和强制转换 类型转换的分类 1.隐式转换: 取值范围小的数值 转换为 取值范围大的数值 2.强制转换: 取值范围大的数值 转换为 取值范围小的数值隐式转换的两种提升规则 取值范围小的,和取值范围大的进行运算,小的…...

为什么视频文件需要压缩?怎样压缩视频体积即小又清晰?

在日常生活中,无论是为了节省存储空间、便于分享还是提升上传速度,我们常常会遇到需要压缩视频的情况。本文将介绍为什么视频需要压缩,压缩视频的好处与坏处,并教你如何使用简鹿视频格式转换器轻松完成MP4视频文件的压缩。 为什么…...

Nginx — Nginx处理Web请求机制解析

一、Nginx请求默认页面资源 1、配置文件详解 修改端口号为8080并重启服务: 二、Nginx进程模型 1、nginx常用命令解析 master进程:主进程(只有一个) worker进程:工作进程(可以有多个,默认只有一…...

GPT Workspace体验

GPT Workspace是一款将强大的自然语言处理模型(如 ChatGPT 和 Gemini)集成到 Google Workspace 应用(如 Google Docs, Sheets, Slides, Gmail 和 Drive)中的工具或插件。它的目标是提升用户在日常办公中的效率和创造力。 以下是对…...

1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯

动态规划解最小花费爬楼梯问题:LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求:给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...