zoukankan      html  css  js  c++  java
  • c++ 调用opencv+tesseract做图片文字识别

    2020年12月28日22:08:08

    环境:windows10 vscode cmake vcpkg

    vcpkg install opencv

    vcpkg install tesseract

    参考手册

     注意:这里的手册或者文档基本都是是python,但是我对比过opencv官方的doxygen版本的文档,方法命名和参数基本一致,所以可以参考着看

    注意网络不好的话使用

    github下载加速网站
     
    1,语言数据
    2,训练过的数据
    Tesseract 4.0x +添加了基于LSTM神经网络的新OCR引擎。最初它可以在x86 / Linux上正常运行(很好),并具有适用于100多种语言和35多种脚本的官方语言模型数据。有关各种类型的模型的详细信息,请参见数据文件。
     
    4.00可从tessdata标记为4.00的版本获得模型文件。它具有从2016年11月开始的模型。可从以下链接获得各个语言文件的链接。
    tessdata 4.00 2016年11月
    4.0.0可从标记为4.0.0的tessdata获得用于版本和更高版本的模型文件。它具有2017年9月以来的旧模型,并已使用tessdata_bestLSTM模型的Integer版本进行了更新。这套训练有素的数据文件同时支持带有--oem 0和的LSTM模型的旧式识别器--oem 1。
    这些模型可从以下Github存储库中获得。
     
    tessdata
    official以下Github存储库中提供了另外两组在Google培训下的受训练数据。这些没有旧模型,只有可用于的LSTM模型--oem 1。
     
    tessdata_best
    tessdata_fast
    建议使用Google的训练好的数据
    https://github.com/tesseract-ocr/tessdata_best
     

    tessdata文件下放入

    chi_sim.traineddata

    chi_sim_vert.traineddata

    eng.traineddata

    逻辑很简单,通过opencv是降噪图片数据,给tesseract-ocr来读取数据,但是写的比较简单,所以识别度比较低,如果需要提高识别率,需要好好调试

     注意:tesseract在某些windows10上会出现可以编译通过,但是不出结果的情况,目前没时间调试具体是版本问题还是环境问题

    开发的话建议还是使用vscode的 remote-ssh,减少线上线下差异,影响开发进度

    #define _CRT_SECURE_NO_DEPRECATE
    
    #include "main.h"
    #include <stdio.h>
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <leptonica/allheaders.h>
    #include <tesseract/baseapi.h>
    #include <tesseract/publictypes.h>
    #include <opencv2/imgproc.hpp>
    
    using namespace cv;
    int main()
    {
    
        std::string image_name = "3.jpg";
        Mat imageMat;
        imageMat = imread(image_name);
        if (imageMat.data == nullptr)
        {
            printf("No image data 
    ");
            return -1;
        }
        Mat blurMat;
        // 图像模糊
        // cv::medianBlur(imageMat, blurMat, 5);
        // 灰度图
        Mat z1, z2;
        cv::cvtColor(imageMat, z1, cv::COLOR_BGR2GRAY);
        // 阈值
        // cv::threshold(z1, z2, 214, 255, cv::THRESH_BINARY);
        // 自动降噪
        cv::adaptiveThreshold(z1, g_grayImage, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 7, 25);
    
        // 显示图片
        namedWindow("Image1", WINDOW_AUTOSIZE);
        imshow("Image1", g_grayImage);
    
        //waitKey(0);
    
        //控制台中文异常
        std::system("chcp 65001");
        char *outText;
        tesseract::TessBaseAPI api;
        // Initialize tesseract-ocr with English, without specifying tessdata path
        if (api.Init(NULL, "chi_sim"))
        {
            std::cout << stderr << std::endl;
            exit(1);
        }
        // 读取图片路径
        // Pix *image = pixRead("3.jpg");
        api.SetImage((uchar *)g_grayImage.data, g_grayImage.cols, g_grayImage.rows, 1, g_grayImage.cols);
    
        // Get OCR result
        outText = api.GetUTF8Text();
        if (outText == nullptr)
        {
            std::cout << "没有数据" << std::endl;
        }
        // printf("OCR output:
    %s", outText);
        std::cout << outText << std::endl;
        // Destroy used object and release memory
        api.End();
        // delete api;
        delete[] outText;
        // pixDestroy(&image);
    
        return 0;
    }

    结果:

    Active code page: 65001
    Warning: Invalid resolution 0 dpi. Using 70 instead.
    文 华 财经 ( 编辑 整理 李 志 伟 ) -- 以 下 为 12 月 24 日 伦敦 金属 交易 所 (LME) 库 存 变化 情况 ( 单位 :
    吨 )
    3
    锡 | 136100 |! -3275|!1 -2.745
    得 “| 1372350 | 1 -5750|1 -0.423
    非 205900 |! -325|1 -0.165
    246654 | 人 +336|T +0.149%
    133850 |T +75|T +0.065%
    轿 2105 一 -625|1 -22.89%
    外 S 人 | 4200 | -4300|1 -370%

    cmake

    # 设置cmake版本
    cmake_minimum_required (VERSION 3.8)
    set(CMAKE_TOOLCHAIN_FILE "D:/cpp/vcpkg/scripts/buildsystems/vcpkg.cmake")
    
    message(STATUS "cmake root:${CMAKE_CURRENT_SOURCE_DIR}")
    
    
    #设置编译器版本
    set(CMAKE_CXX_STANDARD 17)
    # 设置项目名称  cpptest 
    # project(cpptest)
    # 项目类型cxx c++
    project(cpptest CXX)
    # 打印当前编译器标志
    message("C++ compiler flags: ${CMAKE_CXX_FLAGS}")
    # 输出一些信息,调试
    message(STATUS "name:${PROJECT_NAME}")
    
    #查找当前目录下的所有源文件,然后将源文件名保存到变量DIR_SRCS里面
    aux_source_directory(. DIR_SRCS)
    
    # 设置cmake项目之后的输出路径
    # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${opencv_test_SOURCE_DIR}/bin)
    # 内存泄露检查
    # SET(CMAKE_CXX_FLAGS "-fsanitize=address")
    
    # 引入opencv
    find_package(OpenCV CONFIG REQUIRED)
    INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
    # 引入Tesseract
    find_package(Tesseract CONFIG REQUIRED)
    INCLUDE_DIRECTORIES(${Tesseract_INCLUDE_DIRS})
    # 引入Leptonica
    find_package(Leptonica CONFIG REQUIRED)
    INCLUDE_DIRECTORIES(${Leptonica_INCLUDE_DIRS})
    
    # 指定生成目标
    # add_executable (${PROJECT_NAME} "main.cpp")
    # 将源代码添加到此项目的可执行文件
    add_executable(${PROJECT_NAME} ${DIR_SRCS})
    
    # 连接到项目
    target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
    target_link_libraries(${PROJECT_NAME} libtesseract)
    target_link_libraries(${PROJECT_NAME} leptonica)
    
    # target_link_libraries(${PROJECT_NAME} ${Tesseract_LIBS})
    # target_link_libraries(${PROJECT_NAME} ${leptonica_LIBS})
    
    #引入第三方文件,可以引入非cmake项目
    # message(STATUS ${Tesseract_INCLUDE_DIRS})
    # message(STATUS ${Tesseract_LIBS})

    opencv还提供简单的调试工具

    #define _CRT_SECURE_NO_DEPRECATE
    
    #include "main.h"
    #include <stdio.h>
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <leptonica/allheaders.h>
    #include <tesseract/baseapi.h>
    #include <tesseract/publictypes.h>
    #include <opencv2/imgproc.hpp>
    
    using namespace cv;
    
    #define WINDOW_NAME "窗口"
    
    int g_nThresholdValue = 100;
    int g_nThresholdType = 3;
    
    void on_Threshold(int, void *);
    Mat g_srcImage, g_grayImage, g_dstImage;
    
    int main()
    {
    
        std::string image_name = "3.jpg";
        Mat imageMat;
        imageMat = imread(image_name);
        if (imageMat.data == nullptr)
        {
            printf("No image data 
    ");
            return -1;
        }
        Mat blurMat;
        // 图像模糊
        // cv::medianBlur(imageMat, blurMat, 5);
        // 灰度图
        Mat z1, z2;
        cv::cvtColor(imageMat, g_grayImage, cv::COLOR_BGR2GRAY);
        
        //调试模式
        namedWindow(WINDOW_NAME);
        createTrackbar("模式", WINDOW_NAME, &g_nThresholdType, 4, on_Threshold);
        createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue, 255, on_Threshold);
        on_Threshold(0, 0);
        waitKey(0);
        return 0;
    }
    
    void on_Threshold(int, void *)
    {
        threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);
        imshow(WINDOW_NAME, g_dstImage);
    }

  • 相关阅读:
    poj 3466 A Simple Problem with Integers
    java运行脚本语言demo
    Good Bye 2013---B. New Year Present
    游标-----内存中的一块区域,存放的是select 的结果
    Oracle 游标使用全解
    Oracle系列:记录Record
    10大协作办公工具:实现团队工作效率最大化
    如何有效使用Project(1)——编制进度计划、保存基准
    多项目同时进行如何做好进度管理
    @RISK
  • 原文地址:https://www.cnblogs.com/zx-admin/p/14204029.html
Copyright © 2011-2022 走看看