前言
在ocr(光学字符识别)领域,百度飞桨的pp-ocr系列一直是开源界的标杆。2024年发布的pp-ocrv5在精度和速度上都有显著提升,特别是server版本模型,在中文场景下表现尤为出色。
本文将带你从零开始,在linux x64系统上开发一个完整的qt gui文字识别应用,实现图片上传、ocr识别、结果展示、剪贴板操作等核心功能。全程使用c++开发,不依赖python环境,适合生产部署。

一、项目简介
1.1 功能特性
本应用具备以下核心功能:
| 功能 | 说明 |
|---|---|
| 📁 图片上传 | 支持png/jpg/bmp/webp多种格式 |
| 🔍 ocr识别 | 集成pp-ocrv5 server模型,高精度文字识别 |
| 📋 结果展示 | 可视化显示识别结果和检测框 |
| 📎 复制功能 | 支持带序号和纯文字两种复制模式 |
| 📎 粘贴识别 | 直接从剪贴板粘贴图片进行识别 |
| 🤖 自动识别 | 开启后自动触发ocr识别 |
| 📱 系统托盘 | 最小化到系统托盘,支持快捷操作 |
1.2 适用场景
- 📄 文档数字化处理
- 🖼️ 图片文字提取
- 📱 截图文字识别
- 🏢 企业办公自动化
- 🔧 嵌入式设备集成
二、技术架构
2.1 整体架构图
┌─────────────────────────────────────────────────────────┐
│ qt5 gui 界面层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 图片显示 │ │ 结果展示 │ │ 工具栏 │ │ 系统托盘 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ ocr引擎封装层 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 检测模型调用 │ │ 识别模型调用 │ │
│ │ (dbnet++) │ │ (svtr-lcnet) │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ paddle inference 3.0.0 │
│ (cpu推理引擎,支持mkl-dnn加速) │
└─────────────────────────────────────────────────────────┘
2.2 项目目录结构
paddle_inference/ ├── ocr_gui.cpp # 主程序入口及gui实现 ├── ocr_engine.h # ocr引擎封装(核心) ├── models/ # 模型文件目录 │ ├── pp-ocrv5_server_det_infer/ │ │ ├── inference.json │ │ ├── inference.pdmodel │ │ └── inference.pdiparams │ ├── pp-ocrv5_server_rec_infer/ │ │ ├── inference.json │ │ ├── inference.pdmodel │ │ └── inference.pdiparams │ └── ppocr_v5_dict.txt ├── third_party/ # 第三方依赖 │ └── stb/ │ ├── stb_image.h │ └── stb_image_resize2.h ├── paddle/ # paddle inference sdk │ ├── include/ │ └── lib/ ├── cmakelists.txt # 构建配置 └── build/ # 编译输出目录
三、环境准备
3.1 系统要求
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | ubuntu 20.04 lts x64 | ubuntu 22.04 lts x64 |
| 编译器 | gcc 9.0+ | gcc 11.0+ |
| cmake | 3.10+ | 3.20+ |
| qt | 5.12+ | 5.15+ |
| 内存 | 4gb | 8gb+ |
| 磁盘空间 | 5gb | 10gb+ |
3.2 依赖安装
# 更新系统包
sudo apt update && sudo apt upgrade -y
# 安装基础编译工具
sudo apt install -y \
build-essential \
cmake \
git \
wget \
unzip \
pkg-config
# 安装 qt5 开发包
sudo apt install -y \
qtbase5-dev \
qt5-qmake \
libqt5widgets5 \
libqt5gui5 \
libqt5core5a
# 安装 x11 开发库(gui 支持)
sudo apt install -y \
libx11-dev \
libxext-dev \
libxrender-dev \
libxrandr-dev \
libxinerama-dev \
libxcursor-dev \
libxss-dev \
libgl1-mesa-dev
# 安装中文字体(避免乱码)
sudo apt install -y fonts-noto-cjk
提示:如果使用centos/rhel系统,请使用yum或dnf包管理器,包名可能略有不同。
3.3 paddle inference sdk 下载与配置
# 创建项目目录 mkdir -p ~/paddle_inference cd ~/paddle_inference # 下载 linux x64 cpu 版本(paddle inference 3.0.0) wget https://paddle-inference-lib.bj.bcebos.com/3.0.0/cxx_c/linux/cpu/x86-64_avx-mkl/paddle_inference.tgz # 解压 tar -xzf paddle_inference.tgz mv paddle_inference paddle/ # 验证安装 ls paddle/include/ # 应看到:paddle_api.h paddle_inference_api.h 等文件 ls paddle/lib/ # 应看到:libpaddle_inference.so 等库文件
3.4 模型文件准备
# 创建模型目录 mkdir -p models # 下载检测模型 cd models wget https://paddleocr.bj.bcebos.com/pp-ocrv5/chinese_pp-ocrv5_det_infer.tar tar -xf chinese_pp-ocrv5_det_infer.tar mkdir -p pp-ocrv5_server_det_infer mv inference.pdiparams pp-ocrv5_server_det_infer/ mv inference.pdmodel pp-ocrv5_server_det_infer/ mv inference_cfg.json pp-ocrv5_server_det_infer/inference.json # 下载识别模型 wget https://paddleocr.bj.bcebos.com/pp-ocrv5/chinese_pp-ocrv5_rec_infer.tar tar -xf chinese_pp-ocrv5_rec_infer.tar mkdir -p pp-ocrv5_server_rec_infer mv inference.pdiparams pp-ocrv5_server_rec_infer/ mv inference.pdmodel pp-ocrv5_server_rec_infer/ mv inference_cfg.json pp-ocrv5_server_rec_infer/inference.json # 下载字典文件 wget https://github.com/paddlepaddle/paddleocr/raw/release/2.7/ppocr/utils/ppocr_keys_v1.txt mv ppocr_keys_v1.txt ppocr_v5_dict.txt # 返回项目根目录 cd ~/paddle_inference
3.5 第三方依赖(stb_image)
# 创建第三方目录 mkdir -p third_party/stb cd third_party/stb # 下载 stb_image(图片加载) wget https://raw.githubusercontent.com/nothings/stb/master/stb_image.h # 下载 stb_image_resize2(图片缩放) wget https://raw.githubusercontent.com/nothings/stb/master/stb_image_resize2.h cd ~/paddle_inference
四、核心代码解析
4.1 ocr引擎封装(ocr_engine.h)
这是整个项目的核心模块,负责封装paddle inference的调用逻辑。
关键数据结构
// 检测框结构
struct ocrbox {
int x0, y0, x1, y1; // 边界框坐标
float score; // 置信度
};
// 识别结果结构
struct ocrresult {
ocrbox box; // 检测框
std::string text; // 识别文字
float confidence; // 识别置信度
};
// 性能统计结构
struct ocrstats {
double det_ms = 0; // 检测耗时
double rec_ms = 0; // 识别耗时
int num_boxes = 0; // 检测框数量
};
引擎初始化
bool init(const config& cfg) {
cfg_ = cfg;
dict_ = loaddict(cfg_.dict_path);
if (dict_.empty()) return false;
// 创建检测 predictor
paddle_infer::config det_config;
det_config.setmodel(cfg_.det_model, cfg_.det_params);
det_config.disablegpu(); // cpu推理
det_config.setcpumathlibrarynumthreads(cfg_.num_threads);
det_config.switchiroptim(true); // 开启ir优化
det_config.enablemkldnn(); // 开启mkl-dnn加速
det_config.enablenewir(true); // 开启新ir
det_predictor_ = paddle_infer::createpredictor(det_config);
// 创建识别 predictor(配置类似)
// ...
return true;
}
注意事项:
- enablemkldnn() 需要cpu支持avx指令集
- num_threads 建议设置为cpu核心数
- 模型路径必须是绝对路径或相对于运行目录的路径
图像处理流程
原始图片 → 缩放预处理 → 归一化 → 检测模型 → 检测框提取
↓
原始图片 → 裁剪检测框 → 缩放 → 归一化 → 识别模型 → ctc解码 → 文字结果
4.2 主窗口实现(ocr_gui.cpp)
界面布局
// 中心布局 auto* central = new qwidget(this); setcentralwidget(central); auto* mainlayout = new qvboxlayout(central); // 工具栏(按钮组) auto* toolbar = new qhboxlayout; toolbar->addwidget(btnopen_); // 打开图片 toolbar->addwidget(btnrecognize_); // 开始识别 toolbar->addwidget(btncopy_); // 复制文字 toolbar->addwidget(btnpaste_); // 粘贴图片 toolbar->addwidget(btnautorecognize_); // 自动识别 // 分割器:左边图片,右边文字 auto* splitter = new qsplitter(qt::horizontal); splitter->addwidget(scrollarea); // 图片显示区 splitter->addwidget(textedit_); // 文字结果区
检测框绘制
qpixmap annotated = originalpixmap_;
qpainter painter(&annotated);
painter.setpen(qpen(qt::red, 2));
for (size_t i = 0; i < results.size(); ++i) {
auto& r = results[i];
qrect rect(r.box.x0, r.box.y0,
r.box.x1 - r.box.x0,
r.box.y1 - r.box.y0);
painter.drawrect(rect);
// 绘制序号标签
painter.setbrush(qcolor(255, 0, 0, 180));
qrect tag(r.box.x0, r.box.y0 - 16, 22, 16);
painter.drawrect(tag);
painter.setpen(qt::white);
painter.drawtext(tag, qt::aligncenter, qstring::number(i + 1));
}
五、编译与部署
5.1 cmakelists.txt 配置
cmake_minimum_required(version 3.10)
project(pp-ocrv5-gui languages cxx)
set(cmake_cxx_standard 17)
set(cmake_cxx_standard_required on)
# 查找 qt5
find_package(qt5 required components core widgets)
set(cmake_automoc on)
set(cmake_autorcc on)
set(cmake_autouic on)
# paddle inference 配置
set(paddle_root "${cmake_current_source_dir}/paddle")
include_directories(${paddle_root}/include)
link_directories(${paddle_root}/lib)
# 第三方依赖
include_directories(third_party/stb)
# 源文件
set(sources ocr_gui.cpp ocr_engine.h)
# 创建可执行文件
add_executable(ocr_gui ${sources})
# 链接库(顺序很重要!)
target_link_libraries(ocr_gui
qt5::core
qt5::widgets
paddle_inference # 必须在 phi 之前
phi
phi_core
common
glog
gflags
protobuf
pthread
dl
)
# 设置 rpath
set_target_properties(ocr_gui properties
build_rpath "${paddle_root}/lib"
install_rpath "${paddle_root}/lib"
)
5.2 编译步骤
# 创建构建目录 mkdir -p ~/paddle_inference/build cd ~/paddle_inference/build # 配置项目 cmake .. -dcmake_build_type=release # 编译(使用所有cpu核心) make -j$(nproc) # 运行测试 ./ocr_gui
5.3 打包部署
# 创建部署目录
mkdir -p ~/ocr_gui_deploy
cd ~/ocr_gui_deploy
# 拷贝可执行文件
cp ~/paddle_inference/build/ocr_gui .
# 拷贝模型文件
cp -r ~/paddle_inference/models .
# 拷贝依赖库
ldd ocr_gui | grep "=> /" | awk '{print $3}' | xargs -i '{}' cp '{}' ./
# 创建启动脚本
cat > run.sh << 'eof'
#!/bin/bash
export ld_library_path=.:$ld_library_path
./ocr_gui
eof
chmod +x run.sh
# 打包
tar -czf ocr_gui_linux_x64.tar.gz *
六、常见问题与解决方案
问题1:qt5 找不到
错误信息:
cmake error: the following variables are used in this project, but they are set to notfound: qt5
解决方案:
# 确认 qt5 安装 qmake -v # 如果未安装 sudo apt install qtbase5-dev qt5-qmake # 指定 qt 路径(如果需要) cmake .. -dcmake_prefix_path=/usr/lib/x86_64-linux-gnu/cmake/qt5
问题2:paddle inference 链接错误
错误信息:
undefined reference to paddle_infer::createpredictor
解决方案:
# 检查库文件是否存在
ls ~/paddle_inference/paddle/lib/libpaddle_inference.*
# 检查符号
nm ~/paddle_inference/paddle/lib/libpaddle_inference.so | grep createpredictor
# 确认链接顺序(paddle_inference 必须在 phi 之前)
target_link_libraries(ocr_gui
paddle_inference
phi
phi_core
# ...
)
问题3:模型加载失败
错误信息:
notfounderror: cannot open file models/pp-ocrv5_server_det_infer/inference.json
解决方案:
# 检查模型路径 ls -la ~/paddle_inference/models/ # 使用绝对路径 # 在代码中修改配置: cfg.det_model = "/home/username/paddle_inference/models/pp-ocrv5_server_det_infer/inference.json"; # 检查权限 chmod -r 755 ~/paddle_inference/models/
问题4:中文字体显示为方块
解决方案:
# 安装中文字体
sudo apt install fonts-noto-cjk
# 或在代码中指定字体
qfont font("noto sans cjk sc", 12);
textedit_->setfont(font);
问题5:系统托盘不显示(ubuntu 20.04+)
解决方案:
# 安装托盘支持扩展
sudo apt install gnome-shell-extension-appindicator
# 重启 gnome shell
killall -3 gnome-shell
# 或在代码中添加检查
if (qsystemtrayicon::issystemtrayavailable()) {
trayicon_->show();
}
以上就是在linux x64系统开发一个完整的qt gui文字识别应用的详细内容,更多关于linux x64 qt gui文字识别的资料请关注代码网其它相关文章!
发表评论