当前位置: 代码网 > 服务器>服务器>Linux > 在Linux x64系统开发一个完整的Qt GUI文字识别应用

在Linux x64系统开发一个完整的Qt GUI文字识别应用

2026年03月02日 Linux 我要评论
前言在ocr(光学字符识别)领域,百度飞桨的pp-ocr系列一直是开源界的标杆。2024年发布的pp-ocrv5在精度和速度上都有显著提升,特别是server版本模型,在中文场景下表现尤为出色。本文将

前言

在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 x64ubuntu 22.04 lts x64
编译器gcc 9.0+gcc 11.0+
cmake3.10+3.20+
qt5.12+5.15+
内存4gb8gb+
磁盘空间5gb10gb+

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;
}

注意事项

  1. enablemkldnn() 需要cpu支持avx指令集
  2. num_threads 建议设置为cpu核心数
  3. 模型路径必须是绝对路径或相对于运行目录的路径

图像处理流程

原始图片 → 缩放预处理 → 归一化 → 检测模型 → 检测框提取
                                            ↓
原始图片 → 裁剪检测框 → 缩放 → 归一化 → 识别模型 → 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文字识别的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com