最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Linux x64系統(tǒng)開發(fā)一個完整的Qt GUI文字識別應用

 更新時間:2026年03月02日 09:49:14   作者:weixin_46244623  
本文介紹了如何在Linux x64系統(tǒng)上使用C++開發(fā)一個完整的QtGUI文字識別應用,該應用集成了百度飛槳的PP-OCRv5 server模型,具備圖片上傳、OCR識別、結(jié)果展示、剪貼板操作等功能,需要的朋友可以參考下

前言

在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 x64Ubuntu 22.04 LTS x64
編譯器GCC 9.0+GCC 11.0+
CMake3.10+3.20+
Qt5.12+5.15+
內(nèi)存4GB8GB+
磁盤空間5GB10GB+

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

注意事項

  1. EnableMKLDNN() 需要CPU支持AVX指令集
  2. num_threads 建議設(shè)置為CPU核心數(shù)
  3. 模型路徑必須是絕對路徑或相對于運行目錄的路徑

圖像處理流程

原始圖片 → 縮放預處理 → 歸一化 → 檢測模型 → 檢測框提取
                                            ↓
原始圖片 → 裁剪檢測框 → 縮放 → 歸一化 → 識別模型 → 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)文章

最新評論

勃利县| 洪洞县| 房山区| 临城县| 白城市| 松滋市| 大庆市| 商城县| 昆明市| 象州县| 柳州市| 北安市| 金阳县| 上饶县| 泽普县| 辽源市| 余庆县| 平果县| 正定县| 西充县| 临潭县| 柳州市| 吉隆县| 辽宁省| 神农架林区| 龙陵县| 沧州市| 项城市| 什邡市| 中方县| 茶陵县| 汉川市| 平乐县| 荆州市| 浠水县| 宁国市| 莱西市| 河津市| 滦南县| 紫金县| 灌南县|