2026/5/13 8:24:32
网站建设
项目流程
郑州网站建设口碑好,网址关键词查询,企业网站服务,做网站开发的公司销售幅提升。在C#中调用Tesseract (https://github.com/tesseract-ocr/tesseract) 有两个方式#xff1a;命令行调用#xff1a;带参数执行 tesseract.exe 文件#xff0c;读取控制台获取解析结果。适合简单直观#xff0c;不需要写代码#xff0c;直接在终端输入命令即可命令行调用带参数执行 tesseract.exe 文件读取控制台获取解析结果。适合简单直观不需要写代码直接在终端输入命令即可且跨语言通用。Wrapper调用使用封装好的C#库直接调用相关函数。适合深度集成提高性能,减少出错。命令行调用及参数网上已有很好的详细说明如https://tesseract-ocr.cn/tessdoc/Command-Line-Usage.html本文不再赘述已经包含在仓库项目文件中了噢。下面我们通过Wrapper调用的方式来使用Tesseract。C# 目前比较好用的Wrapper有同名的Tesseracthttps://github.com/charlesw/tesseract, A .NET wrapper for tesseract-ocr 5.2.0.在Nuget直接拉取可得到包含运行时和Wrapper库的完整程序直接开箱即用。二、Tesseract模型准备执行OCR之前要准备训练好模型可以在官方仓库找到https://github.com/tesseract-ocr/tessdata_besthttps://github.com/tesseract-ocr/tessdata_fast都是免费。其中语言类模型language .traineddata能直接下载的 100 多种命名规则就是“语言代码[方向/变体]”。常用举例的有 eng、chi_sim、chi_tra、jpn、kor、rus、ara、deu、fra、spa、lat 等。另外就是垂直排版变体 chi_sim_vert、chi_tra_vert、jpn_vert、kor_vert, 其他特殊格式等frak德文花体、equ数学公式、osd。image三、四行代码实现OCR3.1 核心代码核心代码就四行非常简单代码及注释如下// 1. 创建引擎实例参数语言包、数据路径using (var engine new TesseractEngine(tessDataPath, chi_sim eng, EngineMode.LstmOnly)){// 2. 加载图像using (var img Pix.LoadFromFile(imgPath)){// 3. 创建页面对象using (var page engine.Process(img, PageSegMode.Auto)){// 4. 获取识别结果Console.WriteLine(识别结果\n page.GetText());}}}3.2 模型参数模型加载时可同时加载多个语言与命令行参数相似直接用“”拼接即可如eng chi_sim osd。3.3 引擎模式EngineMode对应命令行参数OEM--oem N。4 选 1决定用哪套“底层引擎”0: 仅传统引擎tesseract 3 时代1: 仅 LSTM 神经网络tesseract 4 主推2: 二者都跑再合并结果3: 自动选择默认通常等于 13.4 页面分割模式PageSegMode对应命令行参数--psm N共 14 个等级0-13决定 Tesseract 把图像当成什么版式来处理0: OSD only1: 自动分栏 OSD2: 自动分栏但不做 OSD 也不 OCR未实现3: 完全自动分栏默认模式4: 单列可变尺寸文本5: 单一垂直文本块6: 单一统一文本块7: 单行8: 单个单词9: 圆圈内的单个单词10: 单个字符11: 稀疏文本无顺序12: 稀疏文本 OSD13: 原始行绕过 Tesseract 特殊调整3.5 注意事项根据实际需求选择合适的模型来OCReng对标点符号的处理比较好一般均可以带上。如果是识别车牌照文本或无规律的文本则需要自行考虑改变页面分割模式非常影响识别效果。普通文本OCR如下image结果image四 扩展应用4.1 文本块坐标导出及分级处理遍历page的内部按block、或word分级获取ocr结果的语言、文本及坐标这样可以更好辅助实现证件信息读取using (var iter page.GetIterator()){iter.Begin();do{do{do{do{if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)){iter.GetImage(PageIteratorLevel.TextLine, 0,out var x,out var y);Console.WriteLine($BLOCK ({x},{y}): {iter.GetWordRecognitionLanguage()});}Console.Write(iter.GetText(PageIteratorLevel.Word));Console.Write( );if (iter.IsAtFinalOf(PageIteratorLevel.TextLine, PageIteratorLevel.Word)){Console.WriteLine();}} while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));if (iter.IsAtFinalOf(PageIteratorLevel.Para, PageIteratorLevel.TextLine)){Console.WriteLine();}} while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));} while (iter.Next(PageIteratorLevel.Block, PageIteratorLevel.Para));} while (iter.Next(PageIteratorLevel.Block));}效果如下image识别后每个block后面的数字表示当前文本矩形框的左上角xy坐标image4.2 pdf生成生成导入图像的pdf文件且pdf中OCR内容区域的文本可被拾取。using (IResultRenderer renderer Tesseract.PdfResultRenderer.CreatePdfRenderer(test.pdf, tessDataPath, false)){// PDF Titleusing (renderer.BeginDocument(Serachablepdftest)){using (TesseractEngine engine new TesseractEngine(tessDataPath, chi_simeng, EngineMode.Default)){using (var img Pix.LoadFromFile(imgPath)){using (var page engine.Process(img, Serachablepdftest)){renderer.AddPage(page);}}}}}效果如下image转成pdf文件后的文字拾取效果image五、单文件打包问题单文件发布时可能存在发布成功但运行程序出现错误的问题。这个与wrapper在加载运行时过程中的文件路径及处理有关。本项目中对这个wrapper进行了处理将原来动态加载的非托管库直接写死为win环境下的x64了这样就可以很好的单文件发布13.4mb 模型及aot发布3mb 2.6mb 4mb 模型。修改后的tesseract(wrapper)可以在仓库里找到。算上chi_sim和eng模型所有必须文件加起来独立运行无依赖一共40mb。六、 最后有了tesseractC#实现ocr也是很方便的事情。简单ocr再也不需要花钱注册会员来整了随便自己或找个身边的程序员编译下分分钟就搞定。