再看 AspriseOCR - OCR应用开发

我写这个博文时间为 2015/11/24日,注意时间因为,网上很多文章时间上很久远,有的已经不能参考了

很多人面对从图片中识别文字或者数字0~9  A~Z 的时候都想网上查找相关的技术文章

我也找了很多,但是很可惜没有找到多少有价值的信息

大部分的信息都很老旧而且有关 AspriseOCR 的不少

尤其关于DELPHI + AspriseOCR 的更少

我从网上找到了  AspriseOCR 破解的文件 , 并且已经打包在我的上传资料上,你们可以去下载 AspriseOCR - Crake.zip

我的开发环境  为  DELPHI7 +WIN8 64 位

这个应用有几点要注意

1.  识别的图片只能为   白底黑字 ,其他类型的图片不能正确

2. AspriseOCR.dll  ,DevIL.dll ,ILU.dll

三个文件放在和你开发的APP同样的目录下

3. 调用DLL 函数定义为

//function OCR(imgname:string;imagetype:integer):PChar;stdcall;

//  external 'AspriseOCR.dll';

function OCR(imgname:PChar;i:integer):PChar;stdcall;external 'AspriseOCR.dll';

function OCRBarCodes(imgname:string;imagetype:integer):PChar;stdcall;
  external 'AspriseOCR.dll';

Function OCRpart(filename :String; imagetype:Integer; startX :Integer;
  startY :Integer; width:Integer; height:Integer):PChar;stdcall;
  external 'AspriseOCR.dll';

请看上面第一个函数的定义 OCR  的参数imagname   String 或者 Pchar   哪个正确?

我可以告诉你们  都是可以编译通过的  而且 两种定义都是对的

所以很多事情需要自己验证

-----------------------

截图识别的 图片处理

//我的图列

//图片的2值化 -  网上大部分人的做法

function TFrmMain.CBmpTwoValues(Bmp:TBitmap;grayThreshold:Byte):TBitmap;
var
    p: PByteArray;
    Gray, x, y: Integer;
    aBmp: TBitmap;
begin
    aBmp:=TBitmap.Create;
    //aBmp.Assign(Image1.Picture.Bitmap);
    aBmp:=Bmp;
    //设置为24位真彩色
    aBmp.PixelFormat := pf24Bit;
    randomize;
    for y := 0 to aBmp.Height - 1 do
    begin
        p := aBmp.scanline[y];
        for x := 0 to aBmp.Width - 1 do
        begin
            //一个象素点三个字节
            // Y = 0.299 * R + 0.587 * G + 0.114 * B
            Gray := Round(p[x * 3 + 2] * 0.3 + p[x * 3 + 1] * 0.59 +
                          p[x * 3] * 0.11);
            if gray > grayThreshold then //全局阀值128
            begin
                p[x * 3] := 255;
                p[x * 3 + 1] := 255;
                p[x * 3 + 2] := 255;
            end
            else
            begin
                p[x * 3] := 0;
                p[x * 3 + 1] := 0;
                p[x * 3 + 2] := 0;
            end;
        end;
    end;
    //Image2.Picture.Bitmap.Assign(Bmp);
  Result:=aBmp;
end;

//图片的2值化 -  我自己的做法(针对我的特定图片的)

function TFrmMain.CBmpBlackWhiteExe(aBmp: TBitmap;aMainColor:TColor;aMainTorl:Byte): TBitmap;
var
  bm:TBitmap;
  bx,by:Integer;
  aColor:TColor;
  aClr,aClg,aClb:Byte;
  aChageColorEn:Boolean;
begin
  bm:=TBitmap.Create;
  bm:=aBmp;
  for bx := 0 to bm.Width-1 do
  begin
    for by := 0 to bm.Height-1 do
    begin
      //clBlue = TColor($FF0000); clBlack = TColor($000000);
      //clRed = TColor($0000FF);clWhite = TColor($FFFFFF);
      //clLime = TColor($00FF00);
      aColor:=bm.Canvas.Pixels[bx,by];
      aChageColorEn:=False;
      aClb:=Abs( Byte(aColor shr 16)- Byte(aMainColor shr 16));
      if aClb<=aMainTorl then
      begin
        // Blue ok
        aClg:=Abs( Byte(aColor shr 8)-Byte(aMainColor shr 8));
        if aClg <= aMainTorl then
        begin
          //Green OK
          aClr:=Abs( Byte(aColor)-Byte(aMainColor));
          if aClr <= aMainTorl then
          begin
            //Red ok
            aChageColorEn:=True;
          end;
        end;
      end;

if aChageColorEn then
        bm.Canvas.Pixels[bx,by]:=TColor($FFFFFF);   //White
      else
        bm.Canvas.Pixels[bx,by]:=TColor($000000);  //Black
    end;
  end;

Result:=bm;
  
end;

//图片反色

procedure TFrmMain.Negative(var Bmp:TBitmap);
var
 i, j: Integer;
 PRGB: pRGBTriple;
begin
 Bmp.PixelFormat:=pf24Bit;
 for i := 0 to Bmp.Height - 1 do
 begin
  PRGB := Bmp.ScanLine[i];
  for j := 0 to Bmp.Width - 1 do
  begin
   PRGB^.rgbtRed :=not PRGB^.rgbtRed ;
   PRGB^.rgbtGreen :=not PRGB^.rgbtGreen;
   PRGB^.rgbtBlue :=not PRGB^.rgbtBlue;
   Inc(PRGB);
  end;
 end;
end;

以上只做大家的参考

写的不好  别喷我啊

再看 AspriseOCR - OCR应用开发 -20151124的更多相关文章

  1. 再看Ajax

    再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...

  2. 我看TDD测试驱动开发

    今天在实验室给大家介绍了一下TDD和Docker,大家对TDD都比较感兴趣,包括老板,也问了一些问题. 还是从头来说TDD吧,TDD作为敏捷开发领域的领头军,充满魅力,同时也充满争议.一切从三大军规说 ...

  3. web前端体系-了解前端,深入前端,架构前端,再看前端。大体系-知识-小细节

    1.了解前端,深入前端,架构前端,再看前端.大体系-知识-小细节 个人认为:前端发展最终的导向是前端工程化,智能化,模块化,组件化,层次化. 2.面试第一关:理论知识. 2-1.http标准 2-2. ...

  4. 记录一次OCR程序开发的尝试

    记录一次OCR程序开发的尝试 最近工作中涉及到一部分文档和纸质文档的校验工作,就想把纸质文件拍下来,用文字来互相校验.想到之前调用有道智云接口做了文档翻译.看了下OCR文字识别的API接口,有道提供了 ...

  5. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  6. Android菜鸟的成长笔记(17)—— 再看Android中的Unbounded Service

    原文:Android菜鸟的成长笔记(17)-- 再看Android中的Unbounded Service 前面已经写过关于startService(Unbounded Service)的一篇文章:&l ...

  7. 再看case语句

    再看case语句,case语句只处理单条记录,而不是set 列名的使用,可以当做数值来使用: case when 后面简直是完美的的,什么东西都是能放的,只要是一个逻辑上的true/false的逻辑就 ...

  8. android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

    android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升

  9. python基础----再看property、描述符(__get__,__set__,__delete__)

    一.再看property                                                                          一个静态属性property ...

随机推荐

  1. Windows Server 2012 没有远程桌面授权服务器可以提供许可证,远程会话被中断

    今天在登录公司内部的服务器的时候,无法进行远程访问. 弹出错误信息:没有远程桌面授权服务器可以提供许可证,远程会话被中断 经过网上的寻找,原来是server 2012 远程登录只提供120天的使用期限 ...

  2. SYSLOG审记日志的配置。

    前言 syslog是UNIX系统中提供的一种日志记录方法(RFC3164),syslog本身是一个服务器,程序中凡是使用syslog记录的信息都会发送到该服务器,服务器根据配置决定此信息是否记录,是记 ...

  3. PP 创建BOM

    转自 http://blog.csdn.net/u012369651/article/details/19190939 一.最终结果预览. 二.创建过程. 使用到的事务码 CS01 创建BOM CS0 ...

  4. 小米note3,华为手机,软键盘弹出之后,页面上定位的元素布局会乱掉

    原因:可能是因为,软键盘弹出时,改变了height,使height:100%,不能达到原来的高度. 解决办法: $(document).ready(function () { $('body').he ...

  5. Surprise团队项目总结

    Surprise团队项目总结 项目实现情况 实现人人模式:2个用户在同一台电脑上进行切磋下棋,即实现五子棋游戏的基本功能 实现人机模式:初级模式已经实现,可以进行人机交互,但是还没达到智能判断下棋点 ...

  6. bootstrap-16

    进度条----基本样式: Bootstrap框架中对于进度条提供了一个基本的样式,一个100%宽度的背景色,然后高亮颜色表示完成进度.其实制作这样的进度条非常容易,一般是使用两个容器,外容器具有一定的 ...

  7. codeforces Simple Molecules

    link:http://codeforces.com/contest/344/problem/B 刚开始想复杂了.一开始就想当然地以为可以有多个点,其实,人家题目要求只有3个点啊! 然后题目就简单了. ...

  8. EXCEL导入(反射)

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  9. 前端中JSON对象和JSON字符串的相互转换

    资料来源: http://www.css88.com/archives/3919

  10. [转]Linux命令的返回值

    Linux命令的返回值 对于某些监测脚本和探测命令蛮有用的: 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结束时,都会返回一个数字值,这个值叫做返回值,或者称 ...