在使用电脑录入资料的工作中,有时需要将扫描图片里面的信息录入到电脑上,那有没有想过,用文字识别功能快速录入,这样连手动打字省了不少,网上可能有这样的程序(会要求登录),有能力的同学可以看着做,自己动手来实现。
现在把以上基础的功能实现出来,如果想实现其它的功能,可以在此基础上改进吧
打开Visual Studio开发工具,新建一个WinForm项目,桌面程序,编写用C#语言
关于桌面截图工具的实现步骤,可以看以下这篇文章来做
【截屏工具窗口简单实现原理,附详细代码】
实现了截图功能后,在这基础上继续编写,添加识别文字按钮
关于文字识别,有很多现成的OCR插件,可以在NuGet包管理中查到,
笔者测试了一些插件,没有可参考的文档就不拿来用了,
而有一些插件感觉还可以,在网上能找到相关学习文档,列出如下:
这里的工具项目是用Tesseract插件,
其它的插件根据自己的情况选择来用(只能在64位机系统环境上运行),
在解决方案资源管理面板(文件夹)下,新建一个库项目,命名为TesseractSharp
,
选择这个项目名,鼠标右键选择管理NuGet程序包打开,如下图,去找一个叫Tesseract
插件安装好
只是安装这个
Tesseract
插件显然还不够,缺少依赖文件;
需要去国内开源的GitCode下载一些识别语言所需的库文件,如下:
上面语言包任选一个即可,如果开启方向检测就要用到
osd.traineddata
安装好插件后,把下载好的库文件放到项目目录下的文件夹tessdata
里,
这里实现调用图文识别功能,
在类库项目里面新建一个TesseractSharpTool
类文件,代码如下
public class TesseractSharpTool {
private TesseractEngine engine;
public TesseractSharpTool(){
//识别库文件夹的路径
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata");
// 识别引擎
var eMode = EngineMode.TesseractAndLstm;
// 中文语言包
var langFilename = "chi_sim";
// 识别引擎对象
engine = new TesseractEngine(path, langFilename, eMode);
}
//...
}
初始化识别引擎对象engine
,
接下来,在类里面继续写,实现调用它的方法,代码如下
///
/// 识别图片文字
///
/// 图片
/// 标注块集合
/// 返回格式化的识别结果
public string DetectText(Bitmap ocrImage, List<TextBlock> blocks)
{
using(var pix = PixConverter.ToPix(ocrImage))
{
using (var page = engine.Process(pix))
{
// 这里识别返回结果
var result = page.GetText();
if (!string.IsNullOrEmpty(result))
{
// 如果要标注识别区域的话,就继续写,
// 把获取到的识别区域添加到标注块blocks集合即可(是对数组的引用,无需返回)
// ...
}
return result;
}
}
}
接下来,在之前写好截图工具项目中去写,会引用上面的库项目,
当截图完成,点击识别文字按钮的事件里,去打开一个对话框窗口,
需要新建一个对话框窗口窗体对象,新建时传入截图的一个Image
对象,
传入截图的图片在左侧区域显示(标注块在图片上层);
识别的结果会在右侧区域显示,是一个多行文本框,可以修改;
窗口是可以拖动调整右侧区域大小的;
在窗口加载事件方法里,调用识别方法,代码如下
var blocks = new List<TextBlock>();
var result = string.Empty;
using (var ocr = new TesseractSharpTool())
{
//识别图片
result = ocr.DetectText(panel1.BackgroundImage as Bitmap, blocks);
}
//显示识别结果
richTextBox1.Text = result;
foreach (var block in blocks){
//...将标注块放到图片上层
}
记得要用线程处理识别结果,不然看上去会卡顿的
写到这里,不用多讲,自己动手试试,整个项目就能做出来了,
可见
Tesseract
插件的识别率不是很准确,
显示的一些标注是可以选择复制的,在右侧直接修改复制识别结果;
如果是只识别一些限定内容,可以试试如下代码
//识别单个字符的模式设置,单个字母或者汉字
engine.DefaultPageSegMode = PageSegMode.SingleChar;
//设置白名单的方法
engine.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-");
或者,用一个网上找来的jTessBoxEditorFX工具制作自己的字库给它调用,以提高识别率,
在此项目上,可尝试再写一个库项目,用别的识别插件调用试试,运行效果图如下
用别的插件
PaddleOCRSharp
,可见这个识别率还可以,只能运行在64位机器
想看项目源码请点此这里,或者点此去搜索截图识别,本博客站内请放心下载!
可能手机上看不到源码,请用电脑浏览器查看