前言
1.前面演示了如何通过线段检测后得到拍照文档的四个校正点,后把文档校正,接下就是OCR识别,其实在OCR的时,也可以不用做校正,但对部分场景下的文档,识别精度可能没有那么好而已。
2.考虑到之后要在移动端上做APP,在选择网络模型时要考虑到移动端的算力,只能选择适合移动端的小模型,chineseocr_lite和paddle Mobile都是移动端上不错的选择,我这里试用了chineseocr_lite的模型。
3.我的开发环境是win10, vs2019, opencv4.5, ncnn,如果要启用GPU加速,所以用到VulkanSDK,实现语言是C++。
4.带GUI的效果演示:
校正过之后的效果:
没有校正的效果:
项目流程
1.文本检测就是把文档上所有的文字给检测出来,检测到之后才能切行识别,在一些场景下,如果没有做文档校正的话,文档里面很容易出现检测不到的文本。
2.文本行角度检测,就是检测当前文本行的文字方向,其实这步可以不做,这个模型也可以用来做文档文字方向旋转。
3.文本识别,就是把检测到的文本行一行一行的识别。
工程源码
1.代码太多了,这里就不展示了,整个工程源码和可执行GUI测试程序都上传到CSND,源码都按接口方式写好,只要实例化一个对象就可以调用接口,调用示例如下:
#include "MasterOCR.h"
#include <iostream>
#include <opencv2/opencv.hpp>
//OCR
std::string ocr_model = "models/ocr/ncnn/";
std::string key_path = "models/ocr/key/keys_v1.txt";
int main()
{
LiteNcnnOCR lite_ocr;
lite_ocr.initModel(ocr_model, key_path, 4, true);
cv::Mat cv_src = cv::imread("1.jpg",1);
if (!cv_src.empty())
{
std::vector<std::string> result_str;
lite_ocr.masterOcr(cv_src, result_str);
cv::cvtColor(lite_ocr.cv_padding, cv_src, cv::COLOR_RGB2BGR);
drawTextBoxs(cv_src, lite_ocr.text_boxs, 2);
for (auto v : result_str)
{
std::cout << v << std::endl;
}
}
}
2.资源
可执行exe:https://download.csdn.net/download/matt45m/76348219
学习交流可加企鹅群:767133823