基于PaddleOCR的图像文字识别与程序打包方法
目录
一、基本介绍
二、程序实现
1)环境配置
2)代码实现
3)程序运行结果
三、程序打包
1)使用pyinstaller打包程序
2)添加依赖和模型数据
四、需要注意的问题
五、总结
一、基本介绍
本文主要介绍利用现有开源的图像文字识别(OCR)库,开发一个简单的程序,用于识别图像中的文字信息。当前,开源的OCR库有很多,比如国外的Tesseract、EasyOCR,国内百度、阿里、腾讯等均提供了相应的开源工具包。百度的PaddleOCR在中文识别上准确率很高,百度开发的paddleocr库也为人工智能开发提供了各类算法模型,在人工智能开发领域运用比较广泛。本文基于PaddleOCR,在python中利用百度已经训练好的OCR模型库,完成对图像中文字识别,并将开发程序打包,使其可移植到其他电脑终端使用。
二、程序实现
1)环境配置
(1)新建工程
python程序开发使用的IDE工具是pyChram2023.1.21版,直接新建一个纯python项目,并新构建一个虚拟环境,基本设置如下,工程路径可自定义。

(2)安装依赖包
使用PaddleOCR需要安装两个依赖包,分别是paddlepaddle和paddleocr。这两个依赖包均安装在上一步建立的虚拟环境下(venv_WZSB)。需要注意的是,paddleocr目前只支持到python3.8到python3.11版本,若使用的python版本不在此区间,需要安装一个在此区间的版本,并将当前python解释器设置为此可用的版本,否则paddleocr将安装失败。
![]()
2)代码实现
使用python编写一个简易的窗口程序,用于加载显示需要识别的图片,并将识别的结果显示在窗口中。
(1)设置模型存放路径
首先在代码中设置paddleocr训练模型的存放路径,代码如下。由于我们使用百度工程师已经训练好的模型,所以我们不用再编写具体的文字识别模型,直接使用即可。下面的代码分别表明了检测、识别和分类3个模型文件的存放路径。此处设置的是直接放置在当前工作目录下,若目录下不存在路径和模型,则程序在初次运行时会直接从官网上下载相应模型文件,并存放大指定路径中。
# 自定义模型存储路径 模型不存在时,会自动下载到以下路径中
det_model_path = './det_model' # 检测
rec_model_path = './rec_model' # 识别
cls_model_path = './cls_model' # 分类
(2)实例化paddleocr对象
以下代码实例化了一个paddleocr对象。对象参数指明了是否启用方向分类、识别的文字类型、模型文件路径、是否使用GPU等。需要进一步说明的是,此处参数中选择不使用GPU,因为我们此处安装的paddleocr版本是CPU版。百度paddle官网中提供了多个GPU版本的paddleocr,使用GPU版本需要英伟达显卡支持,并安装英伟达对应显卡的CUDA驱动平台,其安装操作比较繁琐,且一般电脑显卡也不支持paddleocr所适配的版本。因此,此处直接使用了CPU版,其运行效率也可以接受。
# 初始化OCR实例
ocr = PaddleOCR(use_angle_cls=True, # 启用方向分类lang="ch", # 中文识别det_model_dir=det_model_path,rec_model_dir=rec_model_path,cls_model_dir=cls_model_path,use_gpu=False, # 是否使用GPUpage_num=0 # PDF页数选择
)
(3)识别图像文字
完成图像文字识别只需调用对象的ocr()函数即可,参数说明如下:
-
image_path:这是一个字符串类型的参数,表示要进行文字识别的图像文件的路径。可以是本地文件系统中的绝对路径或相对路径。 -
cls=True:这个参数通常用于开启文本方向分类功能。有些图像中的文字可能存在不同的方向(如水平、垂直、倾斜等),开启该功能后,OCR 引擎会先对文字的方向进行分类识别,然后将文字调整到合适的方向再进行识别,从而提高识别的准确性。 -
result:这是一个变量,用于存储 OCR 识别的结果。结果的具体格式和内容取决于所使用的 OCR 库,一般会包含识别出的文字信息以及其在图像中的位置信息等。
程序识别的文字信息放置在word_info[1][0]中,此处直接提取出来用于显示。
result = ocr.ocr(image_path, cls=True)
strs = ''
# 解析并打印结果
for line in result:for word_info in line:text = word_info[1][0]confidence = word_info[1][1]# print(f"识别内容: {text} | 置信度: {confidence:.2f}")# print(text)strs = strs + text + '\n'
3)程序运行结果
如下图所示,随意选取一张带中英文的图片,图中文字信息能够被全部准确识别,说明百度提供的paddleocr库效果很不错。

三、程序打包
pyinstaller是python提供的一个非常实用的打包工具,但直接使用该工具打包后的本项目exe程序并不能在其他电脑上运行,因为程序运行使用到了模型数据,所以需要对打包后的程序进行一些处理工作。网上也提供了很多其他打包paddleocr程序的方法,限于能力水平,均尝试不成功。下面是自己摸索出的一种可行的替代方式。
1)使用pyinstaller打包程序
在PyCharm终端窗口中执行pyinstaller --onefile --windowed --collect-all paddleocr wenzishibie.py,完成后我们会在当前工程目录下看到新建了一个dist文件夹,在该文件夹中有一个exe可执行程序wenzishibie.exe。
2)添加依赖和模型数据
如果直接执行上一步的wenzishibie.exe,程序会报错,缺少依赖库和模型数据,这时我们需要将模型数据和缺少的依赖库拷贝一份到dist文件夹中,如下图所示。正常情况下,pyinstaller命令会将程序所有依赖打包到wenzishibie.exe,但是此处确实仍然存在有依赖缺失的问题。mklml.dll文件就是缺失的动态库,我们在当前的虚拟环境中搜索到该文件,然后复制一份即可。此时我们在该文件夹下就可以直接运行wenzishibie.exe。
将dist文件夹所有内容直接拷贝到其他电脑后,也可以正常运行wenzishibie.exe程序。若需要将dist文件夹中的内容再次打包为一个exe可执行程序,可以使用Enigma Virtual Box打包工具,也可参见使用winrar打包exe程序方法。

四、需要注意的问题
1) 本项目的程序均是在新建的虚拟环境中编写的,因此所有依赖库的安装均应确保安装在了新的虚拟环境中,否则可能存在程序无法运行的问题。
2)在程序打包过程中,我们可以直接将模型数据文件夹拷贝到dist文件中,使其与可执行文件wenzishibie.exe在同一目录下,以确保程序运行时能找到模型文件,并可进一步将程序封装为一个可执行文件,是因为我们在程序代码实现中加载模型时使用的是相对路径(det_model_path = './det_model' ),程序运行时将直接从wenzishibie.exe所在路径下去查找模型文件。如果我们在代码中不使用此路径,则本文所介绍的程序打包方法将不适用,因为程序运行时将无法找到模型文件,除非在移植的电脑上将模型文件复制到代码指定路径下,但这样做失去了程序打包移植的意义。
五、总结
本文介绍了使用paddleocr库编写一个图像文字识别的简单程序,并通过在代码中的特殊处理,结合pyinstaller工具实现图像识别程序打包移植。使用paddleocr库进行文字识别开发简单高效,文字识别率准确率也很高。项目所使用的源代码和模型数据库可从此处下载,以作参考。
相关文章:
基于PaddleOCR的图像文字识别与程序打包方法
目录 一、基本介绍 二、程序实现 1)环境配置 2)代码实现 3)程序运行结果 三、程序打包 1)使用pyinstaller打包程序 2)添加依赖和模型数据 四、需要注意的问题 五、总结 一、基本介绍 本文主要介绍利用现有开源…...
单片机上SPI和IIC的区别
SPI(Serial Peripheral Interface)和IC(Inter-Integrated Circuit)是两种常用的嵌入式外设通信协议,它们各有优缺点,适用于不同的场景。以下是它们的详细对比: — 1. 基本概念 SPI࿰…...
Python 字典(一个简单的字典)
在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。…...
一个简单的Windows TCP服务器实现
初始化 WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr { 0x00 }; struct sockaddr_in clientAddr { 0x00 }; int clientAddrLen sizeof(clientAddr);if (WSAStartup(MAKEWORD(2, 2), &wsaData) ! 0) {printf("WSAStartup f…...
Node.js笔记入门篇
黑马程序员视频地址: Node.js与Webpack-01.Node.js入门 基本认识 概念 定义:Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境, 它让开发人员能够创建服务器 Web 应用、命令行工具和脚本 作用:使用Node.js 编写服务器端程序 ✓ …...
EX_25/2/10
epoll实现多路客户端之间的登录注册及消息和文件传输 服务器部分 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include…...
python视频爬虫
文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析,利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求,可以通过get,p…...
RbFT:针对RAG中检索缺陷的鲁棒性微调
今天给大家分享一篇最新的RAG论文: 论文题目:Enhancing Retrieval-Augmented Generation: A Study of Best Practices 论文链接:https://arxiv.org/pdf/2501.18365 论文代码:https://github.com/StibiumT16/Robust-Fine-tuning 研…...
证明: 极限的局部有界性
在考研数学中,极限的局部有界性是一个非常重要的概念,尤其是在讨论函数的连续性、可积性和可微性等性质时。局部有界性可以帮助我们理解函数在某些区域内的行为。 定理: 如果 lim x → x 0 f ( x ) L \lim_{x \to x_0} f(x) L limx→x0…...
51单片机俄罗斯方块计分函数
/************************************************************************************************************** * 名称:scoring * 功能:计分 * 参数:NULL * 返回:NULL * 备注:采用非阻塞延时 ****************…...
new 以及 call、apply、bind 关键字解析
1.new关键字 自动创建对象:使用new调用构造函数时,会自动创建一个空对象,并将其赋值给this。你不需要显式地使用{}来创建对象。 绑定this到新对象:构造函数内部的this指向新创建的对象,因此可以在构造函数中为新对象添…...
【用Deepseek搭建免费的个人知识库--综合教程(完整版)】第二篇:Ollama服务器
用Deepseek搭建免费的个人知识库–综合教程(完整版):第二篇:Ollama服务器部署 OLLAMA服务器的配置在很多网上都已经介绍的非常清楚了,我们的重点不在于那些简单的步骤,而是在需要为下一步做准备的地方更加…...
【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现
医院在为患者进行诊断和治疗过程中,会产生大量的医学影像图片,如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存,需要将每个患者文件夹下的图片合并成…...
从基础到人脸识别与目标检测
前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…...
Elasticsearch:在 Elastic 中玩转 DeepSeek R1 来实现 RAG 应用
在这个春节,如一声春雷,DeepSeek R1 横空出世。现在人人都在谈论 DeepSeek R1。这个大语言模型无疑在中国及世界的人工智能发展史上留下了重要的里程碑。那么我们改如何结合 DeepSeek R1 及 Elasticsearch 来实现 RAG 呢?在之前的文章 “使用…...
寒假2.6--SQL注入之布尔盲注
知识点 原理:通过发送不同的SQL查询来观察应用程序的响应,进而判断查询的真假,并逐步推断出有用的信息 适用情况:一个界面存在注入,但是没有显示位,没有SQL语句执行错误信息,通常用于在无法直接…...
CTF中特别小的EXE是怎么生成的
我们在打CTF时候,出题的爷爷们给出的exe都很小 就10k左右,有的甚至就5k,那时候我很郁闷啊。现在我也能了啊哈哈 不多bb按如下操作: 我们来看看正常的release生成的代码# Copy #include "windows.h" int main(){ Messa…...
git rebase 和 git merge的区别
Rebase 可使提交树变得很干净, 所有的提交都在一条线上。 Merge 则是包含所有的调试记录,合并之后,父级的所有信息都会合并在一起 Rebase 修改了提交树的历史 比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的…...
Gitlab中如何进行仓库迁移
需求:之前有一个自己维护的新仓库A,现在需要将这个仓库提交并覆盖另一个旧的仓库B,需要保留A中所有的commit信息。 1.方法一:将原有仓库A导出后再导入到新的仓库B中 适用场景:新的仓库B是一个待建仓库,相当…...
LabVIEW 开发航天项目软件
在航天项目软件开发中,LabVIEW 凭借其图形化编程优势被广泛应用。然而,航天项目的高可靠性、高精度及复杂环境适应性要求,使得在使用 LabVIEW 开发时,有诸多关键要点需要特别关注。本文将详细分析在开发航天项目软件时需要重点注意…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
