Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux x64 Qt GUI文字识别

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

作者:weixin_46244623

本文介绍了如何在Linux x64系统上使用C++开发一个完整的QtGUI文字识别应用,该应用集成了百度飞桨的PP-OCRv5 server模型,具备图片上传、OCR识别、结果展示、剪贴板操作等功能,需要的朋友可以参考下

前言

在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文字识别的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文