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 \n");
        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:\n%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 \n");
        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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM