笔者过去使用tesseract-ocr 4.0,一直被识别速度慢和识别率底的问题困扰。最近更新使用了64位的tesseract5.0 dll后识别速度大幅提升,以下是调用DLL的源码和程序说明,供大家参考。

一:下载tesseract DLL和中文字库

方式1,到tesseract官网下载dll和字库,tesseract官网提供源码和编译好的DLL,建议直接使用编译好的DLL,方便省时。以下是64位DLL安装包下载地址:https://github.com/UB-Mannheim/tesseract/wiki

要下载64位版本,笔者测试后发现32位识别率没有64位高。
       中文字库下载地址:https://github.com/tesseract-ocr/tessdata 下载后的中文简体字库chi_sim.traineddata和 chi_sim_vert.traineddata放到安装包的tessdata文件夹下。

方式2,直接下载笔者提供的完整64位DLL和中文字库及Delphi调用源码,地址如下: https://www.gaya-soft.cn/download/

二:调用dll实例
        此delphi源码是由国外的开源项目TTesseractOCR4(https://github.com/r1me/TTesseractOCR4)基础上完善的,原来只支持Tesseract4.0版本,笔者修改了部分源码使之能适应5.0版本。
     源码中tesseractocr.capi.pas单元是定义DLL接口的,是最主要的部分。testMain.pas单元的实现了4个最主要的函数,TessBaseAPICreate是得到一个API接口,TessBaseAPIInit2加载字库,TessBaseAPISetImage2是加载一个图像,TessBaseAPIRecognize是文字识别。
    源码下载地址:  https://www.gaya-soft.cn/download/
    以下是界面设计:
 

代码实现如下:

unit testMain;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Imaging.jpeg, DateUtils,tesseractocr.capi, tesseractocr.leptonica;typeTForm1 = class(TForm)Panel1: TPanel;Panel2: TPanel;Memo1: TMemo;Splitter1: TSplitter;ComboBox1: TComboBox;Label1: TLabel;Image1: TImage;Label2: TLabel;edtImage: TEdit;btSelectImg: TButton;btRecognize: TButton;OpenDialog1: TOpenDialog;btInitialize: TButton;procedure btSelectImgClick(Sender: TObject);procedure btRecognizeClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure btInitializeClick(Sender: TObject);privateFModulePath: string;PApi: TessBaseAPI;FUtf8Text: string;FHOcrText: string;FInitOver: Boolean;function RootPath(): string;function PUTF8CharToString(Char: PUTF8Char; DeleteText: Boolean = True): string;function TessInitialize(DataPath, Language: string; Mode: TessOcrEngineMode = OEM_DEFAULT): Boolean;function SetVariable(Key: string; Value: string): Boolean;function SetImage(FileName: string): PPix; overload;function SetImage(Stream: TMemoryStream): PPix; overload;procedure RecognizeAsText();public{ Public declarations }end;varForm1: TForm1;_CancelRecognize: Boolean;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
varBuf: array [0 .. MAX_PATH] of Char;S: string;
beginSetString(S, Buf, GetModuleFileName(HInstance, Buf, SizeOf(Buf)));FModulePath := ExtractFilePath(S);if (hTesseractLib = 0) thenraise Exception.Create('Tesseract library is not loaded');//_CancelRecognize := False;// 得到一个API接口PApi := TessBaseAPICreate();FInitOver := False;
end;procedure TForm1.FormDestroy(Sender: TObject);
beginif Assigned(PApi) then beginTessBaseAPIEnd(PApi);TessBaseAPIDelete(PApi);end;
end;function TForm1.RootPath(): string;
varI: Integer;
beginResult := FModulePath;for I := Length(Result) - 1 downto 1 do beginif Result[I] = '\' then beginResult := Copy(Result, 1, I);Break;end;end;
end;procedure TForm1.btSelectImgClick(Sender: TObject);
beginOpenDialog1.InitialDir := RootPath() + 'example\';OpenDialog1.Filter := 'Image File|*.JPG;*.PNG;*.GIF;*.BMP;*.JPEG;';if OpenDialog1.Execute() then beginedtImage.Text := OpenDialog1.FileName;Image1.Picture.LoadFromFile(edtImage.Text);end;
end;function TForm1.PUTF8CharToString(Char: PUTF8Char; DeleteText: Boolean = True): string;
varUtfStr: UTF8String;X: Integer;
beginResult := '';if Assigned(Char) then beginX := Length(Char);SetString(UtfStr, Char, X);if DeleteText and (X > 0) thenTessDeleteText(Char);Result := string(UtfStr);end;
end;// 初始化识别字库
function TForm1.TessInitialize(DataPath, Language: string; Mode: TessOcrEngineMode = OEM_DEFAULT): Boolean;
beginSetCurrentDirectory(PChar(FModulePath));//if Assigned(PApi) thenResult := TessBaseAPIInit2(PApi, PUTF8Char(UTF8Encode(DataPath)), PUTF8Char(UTF8Encode(Language)), Mode) = 0elseResult := False;
end;function CancelCallback(cancel_this: Pointer; words: Integer): Boolean; cdecl;
beginResult := _CancelRecognize;
end;function ProgressCallback(Progress: Integer; Left, Right, Top, Bottom: Integer): Boolean; cdecl;
beginResult := False;
end;// 设置识别参数
function TForm1.SetVariable(Key: string; Value: string): Boolean;
beginResult := TessBaseAPISetVariable(PApi, PUTF8Char(UTF8Encode(Key)), PUTF8Char(UTF8Encode(Value)));
end;// 识别图片中的文字
procedure TForm1.RecognizeAsText();
varFMonitor: ETEXT_DESC;
beginFillChar(FMonitor, SizeOf(FMonitor), #0);FMonitor.cancel := @CancelCallback;FMonitor.progress_callback := @ProgressCallback;FUtf8Text := '';FHOcrText := '';//if TessBaseAPIRecognize(PApi, FMonitor) <> 0 thenExit;// 识别文字FUtf8Text := PUTF8CharToString(TessBaseAPIGetUTF8Text(PApi));FUtf8Text := StringReplace(FUtf8Text, #10, #13#10, [rfReplaceAll]);// 识别结果和位置信息FHOcrText := PUTF8CharToString(TessBaseAPIGetHOCRText(PApi, 0));FHOcrText := StringReplace(FHOcrText, #10, #13#10, [rfReplaceAll]);
end;// 加载要识别的图片文件
function TForm1.SetImage(FileName: string): PPix;
beginResult := pixRead(PUTF8Char(UTF8Encode(FileName)));if Assigned(Result) thenTessBaseAPISetImage2(PApi, Result)elseResult := nil;
end;// 加载要识别的内存
function TForm1.SetImage(Stream: TMemoryStream): PPix;
beginStream.Position := 0;Result := pixReadMem(Stream.Memory, Stream.Size);if Assigned(Result) thenTessBaseAPISetImage2(PApi, Result)elseResult := nil;
end;procedure TForm1.btInitializeClick(Sender: TObject);
varLanguage: string;
begincase ComboBox1.ItemIndex of3, 2:Language := 'eng';1:Language := 'chi_sim';elseLanguage := 'chi_sim+eng';end;// 加载需要很长时间,最好只执行一次TessInitialize('tessdata' + PathDelim, Language);FInitOver := True;Memo1.Text := '字库加载完成';
end;procedure TForm1.btRecognizeClick(Sender: TObject);
varStream: TMemoryStream;Bitmap: TBitmap;ImagePix: PPix;T1: TDateTime;F: Int64;
beginif not FInitOver thenbtInitializeClick(Sender);//T1 := Now();//Stream := TMemoryStream.Create();tryBitmap := TBitmap.Create();tryBitmap.Assign(Image1.Picture.Graphic);// 最好把图像转化为标准bmp格式,tesseract加载图片不好用,经常内存错误Bitmap.SaveToStream(Stream);finallyBitmap.Free();end;// 设置内存图片,也可以直接加载内存文件ImagePix := SetImage(Stream);finallyStream.Free();end;//if Assigned(ImagePix) then begintry// 数字的情况,设置识别文字白名单if ComboBox1.ItemIndex = 3 thenSetVariable('tessedit_char_whitelist', '0123456789');// 开始识别RecognizeAsText();// 毫秒数F := MilliSecondsBetween(Now, T1);//Memo1.Text := FUtf8Text + #13#10 + //'-------------------------------HOCRText-------------------------------' + #13#10 + //FHOcrText + #13#10 + Format('%d', [F]);finallypixDestroy(ImagePix);end;end;
end;end.

代码实现中注意以下几点:
1:加载字库需要时间较长,代码实现最好调用一次。
2:Tesseract API接口加载图片文件错误比较多,最好是程序自己实现图片转化为Bitmap图像,直接加载到内存为好。
3:图片适当放大,识别效果更好。
4:如果只识别某些字符,比如数字,先调用SetVariable函数加载字符白名单,效果很好。
5:识别结果可以返回文字位置数据,可以更加这些数据定位文字和图片关系。

三:DLL文件及字库
    Tesseract API主要DLL文件为liblept-5.dll 和 libtesseract-5.dll,其他的是大量的加载图片使用的DLL,tessdata为字库,如下图:

 四:测试效果

一张A4图片的识别时间1.5-3秒左右,中文识别率在96%以上。

笔者还提供PDF图片识别,区域模板识别,请关注。

tesseract ocr 5.0 Api调用,delphi源码实现--识别率超高速度快相关推荐

  1. 免费api调用平台源码

    简介: 里面都是有效的接口,自带统计,直接上传到服务器即可使用,非常方便 网盘下载地址: http://www.bytepan.com/2zCQOZAf6SM

  2. [源码]Delphi源码免杀之函数动态调用 实现免杀的下载者

    [免杀]Delphi源码免杀之函数动态调用 实现免杀的下载者 2013-12-30 23:44:21         来源:K8拉登哥哥's Blog   自己编译这份代码看看 过N多杀软  没什么技 ...

  3. 百度离线地图API2.0 百度离线地图api,已经修改源码

    百度离线地图API2.0 百度离线地图api,已经修改源码,绕过服务端验证,除了路书等需要服务端数据支持的功能外,其余功能已经全部实现,包括常用的:地图示例.地图控件添加.覆盖物添加.信息窗口展示等等 ...

  4. axis2 webservice入门学识(JS,Java,PHP调用实例源码)

    来源:http://www.myexception.cn/web/952419.html axis2 webservice入门知识(JS,Java,PHP调用实例源码) 背景简介 最近接触到一个银行接 ...

  5. delphi源码转换为C++ Builder源码

    本人80年代初出生,正好赶上电子信息高速发展的时代.记得刚接触的计算机高级语言就是PASCAL,但只是草草学了点语法.但开始接触C时,一发不可收拾,C->TBC->C++->BC++ ...

  6. 口袋Delphi源码

    口袋Delphi源码 unit WgUnit; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, C ...

  7. 4- vue django restful framework 打造生鲜超市 -restful api 与前端源码介绍

    使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...

  8. delphi Oracle导出多个表,Oracle数据库自动备份工具(Delphi源码)

    Oracle数据库自动备份工具(Delphi源码) 下载地址:http://www.blogjava.net/Files/96sd2/OraSvr.rar 『OracleBackupService』简 ...

  9. 某页纸api接口网站源码 高速php源码

    介绍: 之前发过某页纸的团队技术导航源码,这次是他的api接口站源码! 接口无需维护更新,后台调用他的api,支持自动更新! 网站底部信息在include/footer.php里面进行修改 网站名称和 ...

  10. PHP百度收录量查询接口源码,百度收录量API查询PHP源码

    百度收录量API查询PHP源码 /* Plugin Name:百度收录量 Version:1.0 Description:根据域名返回百度收录量 Author:绿游 Author URL:http:/ ...

最新文章

  1. 图解深度学习(图灵出品)
  2. Android Fragment 基本介绍
  3. 关于Netbeans调试PHP
  4. c 语言比较三个字符串,C语言字符篇(三)字符串比较函数
  5. [swift] LeetCode 49. Group Anagrams
  6. H3C交换机创建用户
  7. android弹出窗背景透明,Android Dialog 弹框之外的区域 默认透明背景色修改
  8. 机器学习自动写诗-学习笔记
  9. extmail如何登陆mysql_linux下ExtMail邮件使用及管理平台
  10. [LeetCode]Burst Balloons 爆气球
  11. 数控g71编程实例带图_数控车床g71怎么编程?请举个例子谢谢了
  12. 批量下载网页图片,python只需23行代码
  13. shellcode免杀框架内附SysWhispers2_x86直接系统调用
  14. 计算机64位只有2g,电脑插了4G内存,但只有2G左右可以用,为什么 WIN7 64位
  15. 记录一下python爬虫手机app遇到的加密
  16. 负载测试中极限负载_负载测试准则
  17. EEPROM 编程器
  18. uniapp 压缩照片
  19. 进程组、session、前台任务、后台任务、守护进程
  20. nodejs写入json文件,格式化输出json的方法

热门文章

  1. “2016年度优秀软件工程造价师”“工信部行业标准《软件研发成本度量规范》2016年度应用示范单位” 评选活动正式启动...
  2. 微信/qq消息-定时自动循环发送
  3. 谷歌浏览器离线安装包下载
  4. 基于python实现的电影推荐系统
  5. 360浏览器导出Excel闪退BUG
  6. java查看jar包依赖_java项目开发中如何查找到项目依赖的jar包?
  7. android 人脸识别边框_Android camera实时预览 实时处理,人脸识别示例
  8. xmind思维导图模板_思维导图模板
  9. java过滤器Filter实现敏感词汇过滤
  10. 代码整洁之道--程序员的职业素养