几何尺寸与公差论坛

 找回密码
 注册
查看: 4|回复: 1

通用 OCR 文字识别开源库有哪些?

[复制链接]
发表于 昨天 14:42 | 显示全部楼层 |阅读模式
Tesseract OCR
Google 维护的 Apache 2.0 许可 OCR 引擎,支持 100+ 语言(UTF-8),含 C++ API (libtesseract) 和命令行工具,4.x 版本起引入基于 LSTM 的神经网络识别。​
Wikipedia

OpenCV Text 模块(OCRTesseract)
将 Tesseract 封装成 OpenCV 接口,一行代码即可创建 OCRTesseract 对象并调用 run 方法提取文字,同时可获得文字区域框和置信度,便于与前端检测模型集成。​
OpenCV 文档

PaddleOCR(C++ 部署版)
百度开源的深度学习 OCR 解决方案,对中英文字识别都很友好,提供 C++ 推理示例,支持 GPU/CPU 环境,可在工业相机或移动端上高效部署。​
GitHub

EasyOCR
基于 PyTorch 的 Python OCR 库,内置 80+ 语言模型,使用简单,精度在自然场景文字与文档文字上都表现出色。Apache 2.0 许可;适合快速原型与深度学习场景。
 楼主| 发表于 昨天 14:44 | 显示全部楼层
// ocr_demo.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/text.hpp>    // 注意:Text 模块头
#include <iostream>

int main(int argc, char** argv) {
    if (argc < 2) {
        std::cerr << "用法: " << argv[0] << " <图像路径>\n";
        return -1;
    }

    // 1. 读图 & 灰度化
    cv::Mat src = cv::imread(argv[1]);
    if (src.empty()) {
        std::cerr << "无法加载图像: " << argv[1] << "\n";
        return -1;
    }
    cv::Mat gray;
    cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);

    // 2. (可选)二值化/去噪,提升识别率
    cv::Mat bw;
    cv::adaptiveThreshold(gray, bw, 255,
                          cv::ADAPTIVE_THRESH_MEAN_C,
                          cv::THRESH_BINARY, 15, 10);

    // 3. 创建 OCRTesseract 对象
    // - datapath: nullptr → 使用系统环境变量 TESSDATA_PREFIX 指向的 tessdata
    // - language: "eng" 或 "chi_sim"
    // - charWhitelist: nullptr → 识别所有字符
    auto ocr = cv::text::OCRTesseract::create(
        /*datapath=*/nullptr,
        /*language=*/"eng",
        /*charWhitelist=*/nullptr,
        /*oem=*/cv::text::OEM_LSTM_ONLY,
        /*psmode=*/cv::text::PSM_AUTO
    );

    // 4. 运行 OCR
    std::string outputText;
    std::vector<cv::Rect> boxes;
    std::vector<std::string> words;
    std::vector<float> confidences;

    ocr->run(
        bw,                   // 输入:二值化后图像
        outputText,           // 输出:整段文本
        &boxes,               // 输出:文字块区域
        &words,               // 输出:分词结果
        &confidences,         // 输出:对应置信度
        cv::text::OCR_LEVEL_WORD
    );

    // 5. 输出识别结果
    std::cout << "===== 识别文本 =====\n" << outputText << "\n";

    // 6. 可视化:在原图上画出每个文字块与识别结果
    for (size_t i = 0; i < boxes.size(); ++i) {
        cv::rectangle(src, boxes, cv::Scalar(0, 0, 255), 2);
        cv::putText(src, words,
                    boxes.tl() + cv::Point(0, -5),
                    cv::FONT_HERSHEY_SIMPLEX, 0.5,
                    cv::Scalar(0, 255, 0), 1);
    }

    cv::imshow("OCR 结果", src);
    cv::waitKey(0);
    return 0;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2025-4-29 00:43 , Processed in 0.037736 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表