在Linux x64系統(tǒng)開發(fā)一個完整的Qt GUI文字識別應用
前言
在OCR(光學字符識別)領(lǐng)域,百度飛槳的PP-OCR系列一直是開源界的標桿。2024年發(fā)布的PP-OCRv5在精度和速度上都有顯著提升,特別是server版本模型,在中文場景下表現(xiàn)尤為出色。
本文將帶你從零開始,在Linux x64系統(tǒng)上開發(fā)一個完整的Qt GUI文字識別應用,實現(xiàn)圖片上傳、OCR識別、結(jié)果展示、剪貼板操作等核心功能。全程使用C++開發(fā),不依賴Python環(huán)境,適合生產(chǎn)部署。

一、項目簡介
1.1 功能特性
本應用具備以下核心功能:
| 功能 | 說明 |
|---|---|
| ?? 圖片上傳 | 支持PNG/JPG/BMP/WEBP多種格式 |
| ?? OCR識別 | 集成PP-OCRv5 server模型,高精度文字識別 |
| ?? 結(jié)果展示 | 可視化顯示識別結(jié)果和檢測框 |
| ?? 復制功能 | 支持帶序號和純文字兩種復制模式 |
| ?? 粘貼識別 | 直接從剪貼板粘貼圖片進行識別 |
| ?? 自動識別 | 開啟后自動觸發(fā)OCR識別 |
| ?? 系統(tǒng)托盤 | 最小化到系統(tǒng)托盤,支持快捷操作 |
1.2 適用場景
- ?? 文檔數(shù)字化處理
- ??? 圖片文字提取
- ?? 截圖文字識別
- ?? 企業(yè)辦公自動化
- ?? 嵌入式設(shè)備集成
二、技術(shù)架構(gòu)
2.1 整體架構(gòu)圖
┌─────────────────────────────────────────────────────────┐
│ Qt5 GUI 界面層 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 圖片顯示 │ │ 結(jié)果展示 │ │ 工具欄 │ │ 系統(tǒng)托盤 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ OCR引擎封裝層 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 檢測模型調(diào)用 │ │ 識別模型調(diào)用 │ │
│ │ (DBNet++) │ │ (SVTR-LCNet) │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Paddle Inference 3.0.0 │
│ (CPU推理引擎,支持MKL-DNN加速) │
└─────────────────────────────────────────────────────────┘
2.2 項目目錄結(jié)構(gòu)
paddle_inference/ ├── ocr_gui.cpp # 主程序入口及GUI實現(xiàn) ├── 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 # 構(gòu)建配置 └── build/ # 編譯輸出目錄
三、環(huán)境準備
3.1 系統(tǒng)要求
| 組件 | 最低要求 | 推薦配置 |
|---|---|---|
| 操作系統(tǒng) | 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+ |
| 內(nèi)存 | 4GB | 8GB+ |
| 磁盤空間 | 5GB | 10GB+ |
3.2 依賴安裝
# 更新系統(tǒng)包
sudo apt update && sudo apt upgrade -y
# 安裝基礎(chǔ)編譯工具
sudo apt install -y \
build-essential \
cmake \
git \
wget \
unzip \
pkg-config
# 安裝 Qt5 開發(fā)包
sudo apt install -y \
qtbase5-dev \
qt5-qmake \
libqt5widgets5 \
libqt5gui5 \
libqt5core5a
# 安裝 X11 開發(fā)庫(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系統(tǒng),請使用yum或dnf包管理器,包名可能略有不同。
3.3 Paddle Inference SDK 下載與配置
# 創(chuàng)建項目目錄 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 模型文件準備
# 創(chuàng)建模型目錄 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)
# 創(chuàng)建第三方目錄 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的調(diào)用邏輯。
關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
// 檢測框結(jié)構(gòu)
struct OcrBox {
int x0, y0, x1, y1; // 邊界框坐標
float score; // 置信度
};
// 識別結(jié)果結(jié)構(gòu)
struct OcrResult {
OcrBox box; // 檢測框
std::string text; // 識別文字
float confidence; // 識別置信度
};
// 性能統(tǒng)計結(jié)構(gòu)
struct OcrStats {
double det_ms = 0; // 檢測耗時
double rec_ms = 0; // 識別耗時
int num_boxes = 0; // 檢測框數(shù)量
};
引擎初始化
bool Init(const Config& cfg) {
cfg_ = cfg;
dict_ = LoadDict(cfg_.dict_path);
if (dict_.empty()) return false;
// 創(chuàng)建檢測 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優(yōu)化
det_config.EnableMKLDNN(); // 開啟MKL-DNN加速
det_config.EnableNewIR(true); // 開啟新IR
det_predictor_ = paddle_infer::CreatePredictor(det_config);
// 創(chuàng)建識別 Predictor(配置類似)
// ...
return true;
}
注意事項:
- EnableMKLDNN() 需要CPU支持AVX指令集
- num_threads 建議設(shè)置為CPU核心數(shù)
- 模型路徑必須是絕對路徑或相對于運行目錄的路徑
圖像處理流程
原始圖片 → 縮放預處理 → 歸一化 → 檢測模型 → 檢測框提取
↓
原始圖片 → 裁剪檢測框 → 縮放 → 歸一化 → 識別模型 → CTC解碼 → 文字結(jié)果
4.2 主窗口實現(xiàn)(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); // 圖片顯示區(qū) splitter->addWidget(textEdit_); // 文字結(jié)果區(qū)
檢測框繪制
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)
# 創(chuàng)建可執(zhí)行文件
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
)
# 設(shè)置 RPATH
set_target_properties(ocr_gui PROPERTIES
BUILD_RPATH "${PADDLE_ROOT}/lib"
INSTALL_RPATH "${PADDLE_ROOT}/lib"
)
5.2 編譯步驟
# 創(chuàng)建構(gòu)建目錄 mkdir -p ~/paddle_inference/build cd ~/paddle_inference/build # 配置項目 cmake .. -DCMAKE_BUILD_TYPE=Release # 編譯(使用所有CPU核心) make -j$(nproc) # 運行測試 ./ocr_gui
5.3 打包部署
# 創(chuàng)建部署目錄
mkdir -p ~/ocr_gui_deploy
cd ~/ocr_gui_deploy
# 拷貝可執(zhí)行文件
cp ~/paddle_inference/build/ocr_gui .
# 拷貝模型文件
cp -r ~/paddle_inference/models .
# 拷貝依賴庫
ldd ocr_gui | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp '{}' ./
# 創(chuàng)建啟動腳本
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"; # 檢查權(quán)限 chmod -R 755 ~/paddle_inference/models/
問題4:中文字體顯示為方塊
解決方案:
# 安裝中文字體
sudo apt install fonts-noto-cjk
# 或在代碼中指定字體
QFont font("Noto Sans CJK SC", 12);
textEdit_->setFont(font);
問題5:系統(tǒng)托盤不顯示(Ubuntu 20.04+)
解決方案:
# 安裝托盤支持擴展
sudo apt install gnome-shell-extension-appindicator
# 重啟 GNOME Shell
killall -3 gnome-shell
# 或在代碼中添加檢查
if (QSystemTrayIcon::isSystemTrayAvailable()) {
trayIcon_->show();
}
以上就是在Linux x64系統(tǒng)開發(fā)一個完整的Qt GUI文字識別應用的詳細內(nèi)容,更多關(guān)于Linux x64 Qt GUI文字識別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Linux刪除文件提示Operation not permitted的處理辦法
今天小編就為大家分享一篇關(guān)于Linux刪除文件提示Operation not permitted的處理辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Linux系統(tǒng)安裝Samba服務器實現(xiàn)過程
本文介紹了如何在CentOS7系統(tǒng)上安裝和配置Samba服務器,以實現(xiàn)Windows和Linux系統(tǒng)之間的文件共享2026-02-02
Linux網(wǎng)絡啟動問題:Device does not seem to be present解決辦法
這篇文章主要介紹了Linux網(wǎng)絡啟動問題:Device does not seem to be present解決辦法的相關(guān)資料,希望通過本文能幫助到大家解決這樣的問題,需要的朋友可以參考下2017-10-10
linux最快的文本搜索神器ripgrep(grep的最好代替者)
這篇文章主要介紹了linux最快的文本搜索神器ripgrep(grep的最好代替者),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11

