找回密码
 加入
搜索
查看: 23573|回复: 15

[图形处理] 调用MODI实现OCR文字识别的问题,怎么改vb代码为au3[已解决]

 火.. [复制链接]
发表于 2011-1-7 14:09:03 | 显示全部楼层 |阅读模式
本帖最后由 xuzhenjun130 于 2011-1-7 17:49 编辑
史上最简单的图形验证码识别代码 , 下面的代码就是JavaScript, 直接使用Office 2003 中的MODI OCR对象2008-04-19 20:39史上最简单的图形验证码识别代码 , 下面的代码就是JavaScript, 直接使用Office 2003 中的MODI OCR对象

<script>
var oModi = new ActiveXObject("MODI.Document");
oModi.Create("C:\\English.tif");
oModi.Images(0).OCR(9); // 0x804
var oLy = oModi.Images(0).Layout;
alert(oLy.Text);
delete oLy;
delete oModi;
</script> 
我测试上面代码没反应
以下是vb版的
利用微软OCR控件, 只需要不到10行代码就能够实现自已的OCR文字识别软件.
1. 添加控件,需要安装office2003, 没有安装office2003的可以从别人机子上拷贝相关文件,注册regsvr32.exe mdivwctl.dll,
控件一般在这个目录下:C:\Program Files\Common Files\Microsoft Shared\MODI.0, 只需要相关的几个文件就可以了, 此文件夹全部文件大概在21M左右.
2.工程->部件->添加这个控件:Microsoft Office Document Imaging 11.0 Type Library

Option Explicit
'OCR的主要功能
Private Function OCRImageFile(ByVal strName As String) As Boolean
Dim modiDocument As New MODI.Document
Dim modiImages As New MODI.Images
Dim modiImage As New MODI.Image
Dim modiLayout As New MODI.Layout
Dim ImageCount As Integer

Dim i As Integer

modiDocument.OCR miLANG_CHINESE_SIMPLIFIED, False, False
Set modiImage = modiDocument.Images


For i = 0 To ImageCount
Set modiImage = modiImages.Item(i)
Set modiLayout = modiImage.Layout
Text1.Text = modiLayout.Text
Next i

modiDocument.Close False: Set modiDocument = Nothing

If ImageCount > 0 Then
OCRImageFile = True
Else
OCRImageFile = False
End If
End Function
另外一个例子
Sub TestOCR() 

Dim miDoc As MODI.Document 

Set miDoc = New MODI.Document 
Dim OutText As MODI.Layout 

miDoc.Create "C:\1.tif " 

Screen.MousePointer = vbHourglass 
miDoc.OCR miLANG_CHINESE_SIMPLIFIED '语言为简体中文 
'miDoc.OCR 
Set OutText = miDoc.Images(0).Layout '识别第一页的数据 
Text1.Text = OutText.Text 
Screen.MousePointer = vbDefault 
miDoc.Close False 
Set OutText = Nothing 
Set miDoc = Nothing 
End Sub 
下面的c++版的
MODI.Document doc = new MODI.Document();
doc.Create("picPath");
MODI.Image image;
MODI.Layout layout;
string ret = null; 
//doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);识别英文
doc.OCR(MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED, true, 
true);//识别中文
for (int i = 0; i < doc.Images.Count; i++)
{
image = (MODI.Image)doc.Images[i];
layout = image.Layout;
ret += layout.Text;
}
return ret; 
下面的我写的au3,取不到任何文字,很是郁闷,请高手帮忙,根据上面其它版本的代码,写一个能用au3版本的
$obj=ObjCreate("MODI.Document")

$obj.Create("c:\test.tif")
$obj.OCR(9,True,True)
$s=$obj.Images(0).Layout

MsgBox(0,0,$s)
 楼主| 发表于 2011-1-7 14:14:00 | 显示全部楼层
这里有一篇c#版的。http://www.cnblogs.com/lovebanyi/archive/2007/07/06/808242.html
怎么也找不到au3方面的代码。
发个Microsoft Office Document Imaging开发手册,英文vb版的


期待高手出现,有兴趣的帮研究一下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-1-7 14:17:39 | 显示全部楼层
再发资料
基于MODI开发OCR程序小结
     找了一大圈,试过什么文萃、Pegasus Imaging等等,国产、进口的都试过,感觉都不太满意,要么得花钱,要么不支持中文;最后终于发现,远在天边,近在眼前,Office2003里就藏着这么个东西:Microsoft Office Document Image,虽然网上资料不多,但也不难找到,msdn上也有:http://msdn2.microsoft.com/en-us/library/aa167607(office.11).aspx,对包括中英文在内的各种语言的印刷体支持还不错,没试过手写体,估计悬。
     安装完Microsoft Office Document Image后,在项目中分别引用、添加控件:Microsoft Office Document Imaging
11 Type Library,之后分别得到MODI名称空间下的Document、Image等主要操作文档类,以及用于显示文档的AxMODI.AxMiDocView控件;代码比较简单,关键的有如下部分:
   private void SetImage(string filename)
  {
   // set the image..
   try
   {
    _MODIDocument = new MODI.Document();
    _MODIDocument.Create(filename);
    axMiDocView1.Document = _MODIDocument;
    axMiDocView1.Refresh();
   }
   catch(System.Runtime.InteropServices.COMException ee)
   {
    MessageBox.Show(ee.Message);
   }
  }
  

  public void Analyse()
  {
   if (_MODIDocument == null) return;
   try
   {
    // add event handler for progress visualisation
    //_MODIDocument.OnOCRProgress +=  new MODI._IDocumentEvents_OnOCRProgressEventHandler(this.ShowProgress);
               
    // the MODI call for OCR
//    _MODIDocument.OCR(_MODIParameters.Language,_MODIParameters.WithAutoRotation,_MODIParameters.WithStraightenImage);
    _MODIDocument.OCR(MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED, true, true);

    this.textBox1.Text = (_MODIDocument.Images[0] as MODI.Image).Layout.Text;
    //statusBar1.Text = "Ready.";

    _MODIDocument.Close(false);
    _MODIDocument = null;
   }
   catch(Exception ee)
   {
    // simple exception "handling"
    MessageBox.Show(ee.Message);
   }
  }
     问题是编译通过,初始运行也正常,但只要一扫描就报“OCR Runtime Error”,找了半天发现,我的系统是win2003,默认设置为:“除所选外,为所有程序和服务提供数据执行保护”,改成“只为windows程序和服务提供数据执行保护”,重启,搞定!设置方法为:右击“我的电脑”-》高级-》性能设置-》数据执行保护。

     但这只是winform类的程序,现在需求是要在ie里webform上执行,咋办呢?综合考虑之后,还是做成windows control嵌入webform成本最低(嘿嘿,方便啊),牺牲的代价是客户端需安装.net framework,唉,鱼与熊掌不可兼得啊,先凑合着,有机会再优化吧。控件开发也没啥可说的,嵌入网页的代码如下:<OBJECT ID="ocr1" WIDTH="100%" HEIGHT="90%" CLASSID="http:OCRControl.dll#OCRControl.MODIOCRControl" VIEWASTEXT>
</OBJECT>,CLASSID中用#分为两部分,前面是可以包含路径的控件名,后面是类的全名称控件,其中需要注意的是:控件不可放在bin文件夹下,因为bin是系统文件夹,用户不可访问,而winform控件是需要下载到客户端的;运行代码,哈哈,一切OK!稍微有点遗憾就是网页必须发布到IIS,不能象Applet那样直接跑,是因为IE对CLR、JIT不支持还是怎么的?不明白~~。

     换台机器试试,哦?出问题了,控件加载不起来,在页面上显示为类似图片不存在时的小叉,机器是xp,.net framework,modi,一个都不少!是权限问题?原来遇到过webform内嵌winform的情况,好像是要配置什么,给忘了;试着把IE的internet选项里安全都调低,信任站点也加上,还是不管用。google一下,最终找到比较权威的解决办法:以上关于权限设置也是需要的,另外在对目录做web共享时,应用程序权限要设为“脚本”(默认就是),最关键的是,需要配置.net framework的运行库安全策略,控制面板-》microsoft .net framework (版本号) 配置-》我的电脑-》运行库安全策略-》计算机-》代码组-》all code-》添加子代码组-》输入名称、说明-》选择条件类型为URL-》输入程序URL,如http://localhost/*-》使用权限FullTrust(完全信任)-》完成。

     再运行程序,出来了,爽啊。
发表于 2011-1-7 15:27:53 | 显示全部楼层
 楼主| 发表于 2011-1-7 16:20:01 | 显示全部楼层
_ArrayDisplay($sArray,"OCR Result")
回复 4# popyoung

http://www.autoitscript.com/foru ... au3-in-a-few-lines/
郁闷,运行出错啊
D:\My Documents\桌面\新建 AutoIt v3 脚本 (3).au3(40,42) : WARNING: $WS_OVERLAPPEDWINDOW: 使用前并未进行声明.
                    $WS_OVERLAPPEDWINDOW +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\My Documents\桌面\新建 AutoIt v3 脚本 (3).au3(40,56) : WARNING: $WS_VISIBLE: 使用前并未进行声明.
                    $WS_OVERLAPPEDWINDOW + $WS_VISIBLE +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\My Documents\桌面\新建 AutoIt v3 脚本 (3).au3(40,74) : WARNING: $WS_CLIPSIBLINGS: 使用前并未进行声明.
                    $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\My Documents\桌面\新建 AutoIt v3 脚本 (3).au3(40,42) : ERROR: $WS_OVERLAPPEDWINDOW: 未声明的全局变量.
                    $WS_OVERLAPPEDWINDOW +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\My Documents\桌面\新建 AutoIt v3 脚本 (3).au3 - 1 error(s), 3 warning(s)
飀?Create ( "Embedded MODI View
 楼主| 发表于 2011-1-7 16:26:02 | 显示全部楼层
本帖最后由 xuzhenjun130 于 2011-1-7 16:27 编辑

去除多余的代码,用英语没问题有结果,但是一换其它语言就出错
; http://msdn2.microsoft.com/en-us/library/aa202819(office.11).aspx
#include <GUIConstants.au3>
#include <Array.au3>

Dim $miDoc, $Doc
Dim $str
Dim $oWord
Dim $sArray[500]
;语言类型
Const $miLANG_ENGLISH = 9
Const $miLANG_CHINESE_SIMPLIFIED = 2052
Const $miLANG_CHINESE_TRADITIONAL = 1028

$miDoc = ObjCreate("MODI.Document")
$miDocView = ObjCreate("MiDocViewer.MiDocView")
$miDoc.Create("C:\1.tif")
$miDoc.Ocr(9, True, False);当这里用2052时就会出错

$MiDocView.Document = $miDoc
$MiDocView.SetScale (0.75, 0.75)

$i = 0
For $oWord in $miDoc.Images(0).Layout.Words

    $str = $str & $oWord.text & @CrLf
    $sArray [$i] = $oWord.text
    $i += 1
Next
_ArrayDisplay($sArray,"OCR Result")
错误提示,
D:\My Documents\??\?? AutoIt v3 ?? (3).au3 (26) : ==> ?????????????.:
$sArray [$i] = $oWord.text
^ ERROR

高手帮看看
发表于 2011-1-7 16:29:06 | 显示全部楼层
我已经成功了。他漏了include一些东西。
我这里精简的核心代码是这个。注意我发现图片太小会出问题,暂时可以自己把图片弄大点。
$obj=ObjCreate("MODI.Document")

$obj.Create("你的图片")

$obj.Ocr(9,True,True)
For $oWord in $obj.Images(0).Layout.Words
        ConsoleWrite($oWord.text & @CRLF)
Next
 楼主| 发表于 2011-1-7 16:45:03 | 显示全部楼层
回复 7# popyoung
我郁闷啊
#include <GUIConstants.au3>
#include <Array.au3>

$obj=ObjCreate("MODI.Document")

$obj.Create("c:\test.tif")

$obj.Ocr(9,True,True)   ;9是英文,2052是中文,当用2052时就会出错,没法显示数组,用9就可能,当然,把$sArray [$i] = $oWord.text去了,用2052也不会出错
$i=0
Dim $sArray[500]
For $oWord in $obj.Images(0).Layout.Words
        ConsoleWrite($oWord.text & @CRLF)
    $sArray [$i] = $oWord.text
        $i += 1

Next
_ArrayDisplay($sArray)
D:\My Documents\??\test.au3 (14) : ==> ?????????????.:
$sArray [$i] = $oWord.text
^ ERROR
靠,中文和数组有什么关系?
 楼主| 发表于 2011-1-7 17:46:28 | 显示全部楼层
奋斗一天,终于成功了!感谢popyoung ,感谢popyoung
#include <Array.au3>
$obj=ObjCreate("MODI.Document")
$obj.Create("c:\test.tif")

$obj.Ocr(2052,True,True) ;9为英文,2052简体,1028繁体
Dim $a[1]

  For $oWord in $obj.Images(0).Layout.Words
        _ArrayAdd($a,$oWord.text)
  Next

_ArrayToString($a)
MsgBox(0,0,_ArrayToString($a,""))
show一下效果!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-1-7 18:23:33 | 显示全部楼层
客气客气。正好这两天在看这个,正好搜到。
发表于 2011-1-7 19:53:38 | 显示全部楼层
很好,很强大,下载研究下
发表于 2012-11-19 18:16:54 | 显示全部楼层
这帖子收益匪浅啊!谢谢了
发表于 2012-12-31 19:18:30 | 显示全部楼层
非常有用的帖子,好好研究一番!
发表于 2013-1-5 17:17:53 | 显示全部楼层
楼主厉害,向高手学习
发表于 2013-4-20 00:03:28 | 显示全部楼层
无法成功,报错

D:\prj\Au3\mb\del.au3 (18) : ==> The requested action with this object has failed.:
$miDoc.Ocr(9, True, False)
$miDoc.Ocr(9, True, False)^ ERROR
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 23:32 , Processed in 0.086359 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表