基于Qt与PaddleOCR的跨平台OCR工具开发实战

使用qt+PaddleOCR做一个OCR软件demo 文章目录使用qt+PaddleOCR做一个OCR软件demo效果展示1 建立环境1.1 vs项目环境1.2 qtcreator项目环境1.2.1 源代码整理1.2.2 依赖项整理如下1.2.3 模型文件如下1.2.4 在.pro文件中设置依赖库的模式1.2.5 pro文件中添加.h和.lib2 在工程代码中添加截图功能2.1 新建截图类并连接信号2.2 QImage转cv::Mat3 在工程代码中集成PaddleOCR3.1 初始化PaddleOCR3.2 修改文字识别类的run函数,增加一个返回结果的值的 阅读详情

1. 为什么选择Qt+PaddleOCR来打造你的第一个跨平台OCR工具?

如果你正在寻找一个既能快速上手,又能做出实用工具的桌面应用开发方案,那么Qt和PaddleOCR的组合绝对值得你花时间研究。我做了这么多年AI应用落地,发现很多开发者,尤其是刚入行的朋友,常常被两个问题困扰:一是模型部署太复杂,二是做出来的东西只能在特定系统上跑。而今天要聊的这个组合,正好能帮你优雅地解决这两个痛点。

Qt 是什么?简单说,它是一个“一次编写,到处编译”的C++图形界面框架。你用同一套代码,就能生成在Windows、Linux、macOS上都能运行的应用程序。这对于需要分发给不同操作系统用户的工具来说,简直是神器。它的信号与槽机制让界面和后台逻辑解耦得非常清晰,写起来很舒服。

PaddleOCR 呢?这是百度飞桨开源的OCR工具库,识别精度在开源方案里是第一梯队的,特别是对中文的支持非常好。它提供了从文本检测到识别的一整套C++推理库,也就是 Paddle Inference,我们可以直接把它集成到我们的Qt程序里,完全脱离Python环境,让最终的用户无需安装任何复杂的Python依赖就能使用。

想象一下这个场景:你需要从大量的截图、扫描件里提取文字,手动录入效率太低,而市面上的OCR软件要么收费,要么功能不符合你的需求。自己动手,用Qt做个漂亮的界面,背后用PaddleOCR提供强大的识别引擎,一个专属的、跨平台的OCR小工具就诞生了。无论是整理电子书、做会议记录,还是处理一些简单的票据,都非常方便。接下来,我就带你从零开始,一步步把这个想法变成现实。

2. 项目环境搭建:VS和QtCreator双线作战

我个人的开发习惯是在Visual Studio里写代码,因为它的智能提示和调试功能用起来更顺手。但考虑到项目最终要发布给更多人使用,而很多用户可能并没有安装VS庞大的运行时库,所以用QtCreator配合MinGW编译器生成一个更轻量、依赖更少的发布版本,是更友好的选择。因此,我们的项目结构会同时支持这两种构建方式。

2.1 准备核心材料:PaddleOCR推理库与模型

第一步,不是急着打开IDE,而是先把“食材”准备好。我们需要去PaddleOCR的GitHub仓库下载两个核心的东西:C++推理库和预训练模型。

  1. 下载Paddle Inference预测库:访问PaddlePaddle官网的“推理部署”页面,根据你的系统(Windows/Linux)和需求(CPU/GPU版本)下载对应的预测库。对于新手,我强烈建议先从Windows CPU版本开始,避免CUDA环境带来的额外麻烦。下载后得到一个类似 paddle_inference_install_dir 的文件夹,里面包含了我们需要的所有头文件(.h)和库文件(.lib, .dll)。
  2. 下载OCR预训练模型:PaddleOCR提供了多种模型,对于这个Demo,我们使用效果和速度平衡得比较好的PP-OCRv3系列。你需要下载三个模型:
    • 检测模型 (ch_ppocr_server_v2.0_det_infer):负责找出图片中文字的位置。
    • 识别模型 (ch_ppocr_server_v2.0_rec_infer):负责把文字区域识别成具体的文本。
    • 方向分类模型 (ch_ppocr_mobile_v2.0_cls_infer):可选,用于判断文字方向是否颠倒,并进行校正。对于截图这类正放图片,可以暂时关闭以提升速度。

把下载好的模型文件(每个模型包含 .pdmodel, .pdiparams, .pdiparams.info 三个文件)分别放到三个以模型名命名的文件夹里。

2.2 构建Visual Studio项目

在VS中创建一个新的Qt Widgets Application项目。创建好后,我们开始组织项目目录,这是保持项目清晰的关键。我会在项目根目录下创建一个 3rdparty 文件夹,把所有第三方依赖都扔进去,结构如下:

你的项目根目录/
├── YourProject.sln
├── YourProject.vcxproj
├── 3rdparty/
│   ├── opencv/           # 放置OpenCV的库和头文件
│   │   ├── include/
│   │   └── opencv_world440.lib, opencv_world440.dll
│   └── paddle_inference_install_dir/  # 刚下载的Paddle推理库
│       ├── paddle/
│       │   ├── include/
│       │   └── lib/ (paddle_inference.lib, paddle_inference.dll)
│       └── third_party/  # 各种第三方依赖库,如protobuf, glog等
├── Model/                # 放置下载的三个模型文件夹
├── PaddleOCR/           # 从PaddleOCR官方C++示例代码中拷贝的cpp_infer源码
└── ScreenWidget/        # 我们自己实现的截图功能类

接下来是最重要的环节:配置VS项目属性。右键项目 -> 属性,我们需要设置以下几处:

PaddleOCR2.7+Qt5 PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助力开发者训练出更好的模型,并应用落地。 阅读详情

相关推荐

QT集成PaddleOCR与百度OCR:从环境搭建到跨平台文字识别实践

本文详细介绍了如何在QT框架中集成PaddleOCR与百度OCR,实现跨平台文字识别功能。从环境搭建、依赖管理到代码实现与性能优化,提供了全面的实践指南。通过混合架构设计,结合本地与云端OCR优势,显著提升识别效率与准确率,适用于票据识别、合同处理等多种场景。

weixin_30015371的博客 149

Tesseract OCR vs PaddleOCR 完整对比,落地选型指南

Tesseract:传统规则型 OCR,英文清晰文档够用,中文、实拍图效果差,无文字检测;PaddleOCR:深度学习端到端 OCR,中文实拍 / 票据 / 倾斜文字精度碾压 Tesseract,自带检测矫正,支持 GPU 加速,适合工业 Qt 项目。

雪的季节 2099

Qt5.13+PaddleOCR实战:从零搭建跨平台OCR工具(附VS/QtCreator双环境配置)

本文详细介绍了如何利用Qt5.13框架与PaddleOCR引擎构建跨平台OCR工具,涵盖Visual Studio和QtCreator双环境配置、PaddleOCR集成核心要点、图像处理优化及跨平台GUI设计。通过实战代码和性能优化策略,帮助开发者高效实现OCR功能,提升识别准确率和处理速度。

weixin_30251829的博客 123

《PaddleOCR》二、编译成dll 并在QT中调用

配置paddleOCR3.10,并编译成dll,集成到QT项目中简单实现文字识别

qq_26324537的博客 1073

基于Qt的OCR车牌识别系统设计与实现

OCR(Optical Character Recognition,光学字符识别)技术是一种将图像中的文字信息转换为可编辑文本的技术。OCR技术广泛应用于文档数字化、信息录入自动化、车牌识别、发票识别、书籍扫描、手写体识别等多个领域。在工业和商业应用中,OCR技术可以显著提升工作效率,减少人工输入带来的错误和成本。例如:文档数字化:将纸质文档扫描为电子文本,便于存储与检索。自动化办公:发票、合同等纸质文件的自动识别与录入。交通管理:在智能交通系统中,用于识别车辆牌照信息。

weixin_35639680的博客 1146

qt ocr 百度飞浆paddleocr测试软件.zip

用QT写的利用高拍仪识别身份证的一个软件,还有不成熟的地方,大家多多指教

paddle-OCR和QT的源代码,附上详细说明

参考这位博主(https://download.youkuaiyun.com/download/ShareProgress/19960301?spm=1001.2014.3001.5503)进行了自己的改动,里面包含使用说明;如果编译有问题可以私信我。该代码优先建议在QT5.12.9,VS2017,opencv4.5.2(opencv可以其他版本)的环境下进行运行。

使用qt + paddleocr 实现app对特定文本进行抹除的功能

主要是利用qt中的qml 和paddleocr 制作成一个带识别文字功能的app,app具有拍照,打开系统相册的功能,还有模板匹配的相关功能,里边有封装好的文字识别功能

Jetson Nano官方镜像下载&烧录

在NVIDIA Jetson Nano开发者套件上安装NVIDIA官方Ubuntu镜像

weixin_44222088的博客 8848

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 617

proteus仿真51单片机操作指南:串口通信仿真配置详解

深入讲解如何在proteus仿真51单片机中实现串口通信,涵盖虚拟串口设置、电路连接与调试技巧,帮助开发者高效完成通信仿真验证。

weixin_36197669的博客 570

把 ABAP 出站 IDoc 做到稳如老狗:从数据抽取到端口投递的全链路拆解

SAP出站IDoc创建流程解析 本文详细拆解了SAP系统中出站IDoc的创建流程,将其归纳为四个关键阶段:数据获取、数据转换、控制记录校验和端口投递。文章指出,IDoc的稳定性取决于整条流水线的设计质量,而不仅仅是字段映射。 核心要点包括: IDoc由控制记录和数据记录组成,需在WE31/WE30中定义段结构 2.数据获取阶段需明确触发点、依赖链和一致性保证 3.数据转换应遵循"结构版本+映射纪律"原则 4.控制记录校验决定IDoc能否发出,需与WE20伙伴配置匹配 5.端口类型(tRF

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

镜头像差之五——场曲

什么是场曲? 场曲[curvature of field] 物面上所有的点经过系统后,最佳焦点位置不在同一平面上,若这些像点所成的面为曲面,则称为系统有场曲。 与物高二次方、入射光瞳口径一次方成正比的像差。若仅存在场曲,则所有物平面上的点都有相应的像点,但分布在一个球面上;若采用弯成此种形状的底片,则可获得处处清晰的像。此时在理想像平面上,像点呈现为圆斑。 第一张图是最简单也是最容易理解的场曲,也就是对焦点锐利,其余部分逐渐松散,但实际上大多现代镜头的场曲都呈现为图二的形态:对焦点与边缘锐度.

camerall 1万+

YooAsset 学习

YooAssets使用教程

weixin_44884538的博客 1659

YOLO26一文弄懂 | YOLO26内容详解、网络结构解读 、yolo26.yaml配置文件详细解读与说明、YOLO26虚拟环境安装、模型训练、验证、推理参数详细解析 | 通俗易懂!入门必看系列!

YOLO26目标检测模型创新与应用指南 本文全面介绍了YOLO26目标检测模型的创新特性、网络结构及实践应用。YOLO26基于四大核心原则设计:简洁性(移除NMS后处理)、部署效率(端到端架构)、训练创新(MuSGD优化器)和任务优化(支持多种视觉任务)。模型包含五种尺寸规格,CPU推理速度提升43%,支持目标检测、实例分割、姿态估计等任务。 文章详细解析了YOLO26的网络结构(Backbone-Neck-Head三部分)和yaml配置文件,提供了从虚拟环境配置到模型训练、验证、推理的完整教程。

Ai缝合怪、助力小伙伴高效发论文 2万+

你以为你懂 Java 反射?看了这篇源码分析,我发现我以前都错了

摘要:本文讲述了一次生产环境Metaspace内存溢出的故障排查经历。事故源于一个通用数据导出功能中频繁使用反射调用method.invoke(),触发了JVM的"膨胀机制":当同一Method对象调用超过15次时,JVM会动态生成GeneratedMethodAccessor类,导致Metaspace被撑爆。文章分析了问题根源在于循环中反复调用getMethods()创建新Method对象,并提出了三种解决方案:缓存Method对象、改用MapStruct/MethodHandle工具

BUG猿的博客 770

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 电机控制-PMSM无感FOC控制(六)非观测区电流重构技术 — 移相法优化
下一篇: UKF vs EKF:5个非线性场景实测对比(含误差分析图)
人间清醒863
博客等级 码龄3年 33粉丝 1544原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值