2020年12月28日22:08:08
环境:windows10 vscode cmake vcpkg
vcpkg install opencv
vcpkg install tesseract
参考手册
注意:这里的手册或者文档基本都是是python,但是我对比过opencv官方的doxygen版本的文档,方法命名和参数基本一致,所以可以参考着看
注意网络不好的话使用
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); }