文档扫描识别——OpenCV与C++实现OCR文字识别

前言

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 
#include 

//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

你可能感兴趣的:(C++,计算机视觉,opencv,opencv,c++,计算机视觉)