在Linux x64系统开发一个完整的Qt GUI文字识别应用
前言
在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文字识别的资料请关注脚本之家其它相关文章!
相关文章
Centos 通过 Nginx 和 vsftpd 构建图片服务器的教程(图文)
本篇文章主要介绍了Centos 通过 Nginx 和 vsftpd 构建图片服务器的教程(图文),具有一定的参考价值,有兴趣的可以了解一下2017-08-08
Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)
这篇文章主要介绍了Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程),文中通过图文代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07
linux内核copy_{to, from}_user()的思考
本文即将介绍copy_{to,from}_user()接口的使用应,它是kernel space和user space沟通的桥梁,接下来一起学习学习吧2021-08-08


最新评论