C#图片文字识别

来源:互联网 发布:javascript编写计算器 编辑:程序博客网 时间:2024/05/11 03:59

1、

1、 前言
  光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。OCR技术非常专业,一般多是印刷、打印行业的从业人员使用,可以快速的将纸质资料转换为电子资料。关于中文OCR,目前国内水平较高的有清华文通、汉王、尚书,其产品各有千秋,价格不菲。国外OCR 发展较早MODI,像一些大公司,如IBM、微软、HP等,即使没有推出单独的OCR产品,但是他们的研发团队早已掌握核心技术,将OCR功能植入了自身的软件系统。
  MODI也就是Office 2003中的MicrosoftOffice Document Imaging 的缩写,它是我们安装Office时需要选择安装的一个组件。当我们安装Office选择安装MODI后,我们就可以轻松的把MODI中的OCR功能添加扫我们的应用程序中去。在MODI的帮助下,我们只需要写很少的代码就能够完成OCR的功能。
  2、 MODI的应用
  由于MODI组件是Office 2003自带的一个组件,所以我们必须安装Office 2003以上版本才会有MODI组件。当我们在使用MODI进行开发的时候,只要支持外部引用的编译器都可以使用MODI组件。在这里我们使用C#来进行MODI程序的开发和示例。
  2.1 添加MODI组件
  我们首先需要添加MODI引用到我们的工程文件中去。我们在添加引用库的时候,选择COM组件库,我们可以看到Microsoft Office DocumentImaging 11.0 Type Library组件(对应文件为MDIVWCTL.DLL)。添加成功后,我们可以在VS2008 C#的解决方案管理器的引用栏中看到MODI项,这就说明我们添加MODI成功了。
  2.2 利用MODI组件中的Document对象
  Document对象是MODI中最重要的一个对象,它提供了图片的引入、扫描等重要的方法。在这里我们首先创建一个MODI中的Document对象的一个实例:
  MODI.Document_MODIDocument = newMODI.Document(); 
  然后把需要处理的文档图片准备好。图片的格式为TIFF或者BMP。当然我们有必要首先对图片进行一些必要的处理,尽量让图片干净、清晰论文网站大全。然后可以利用Document对象中的Create()方法,引入图片文档:_MODIDocument.Create(filename);期中MODI,filename为图片文档的路径。
  2.3 运用Document对象的OCR方法,进行文字的处理
  OCR( )方法是文字识别的一个重要的方法,它决定了图片识别的精度。
  _MODIDocument.OCR(_MODIParameters.Language,
  _MODIParameters.WithAutoRotation, 
  _MODIParameters.WithStraightenImage);
  在调用了OCR方法之后,所有图片的文档就已经被处理好了。若图片文档有很多页,如果想单独的处理某一页,可以调用MODIimage.OCR()方法来单独处理。
   其中OCR()方法中有三个重要的参数,分别为:
  ①Language ②AutoRotation③StraightenImage
  这三个参数的设置是与图片文档上面的字符类型、格式密切相关的。
  其中,第一个参数Language,表示的是当前文档上的字符是哪种语言的字符,我们只要选择相对应的语言参数就可以了;
  第二个参数AutoRotation,是个布尔型的参数,表示的是自动旋转设置。可能图片的文档方向不是正向的,所以需要设置这个参数来开启是否自动旋转功能;
  第三个参数StraightenImage,表示的是自动扶直图片。当字体有倾斜时,设置此选项可以自动纠正文字的倾斜。
  这三个参数根据文档的具体情况来设置,才能达到更精确的效果。下图为选择OCR参数后开始OCR的界面。
  MODI
  图1 图像文字识别
  2.4 追踪OCR扫描的进度
  整个OCR过程可能会花去一些时间,我们可以关注这个扫描的过程。因此利用OnOCRProgress事件MODI,来跟踪整个OCR的处理过程。
  利用下面的代码,就可以跟踪OCR的处理进度。
  _MODIDocument.OnOCRProgress += newMODI._IDocumentEvents_OnOCRProgressEventHandler(this.ShowProgress);
  public void ShowProgress(int progress,ref bool cancel)
  { statusBar1.Text =progress.ToString() + "% processed."; }
  2.5 利用MODI中的Document Viewer对象
  Document Viewer对象和Document对象一样,都属于同一个组件库MDIVWCTL.DLL,只需要对Document Viewer有个简单的声明,就可以使用Document Viewer对象了。运用Document Viewer对象可以对图片文件进行选择、画图等操作。
  MODI.MiDocView ax MiDocView1=newMODI.MiDocView( );
  axMiDocView1.Document = _MODIDocument;
  处理OCR之后的结果
   for(inti=0;i<= axMiDocView1.PageNum;i++)
   {axMiDocView1.selectAll(i); }
  string ocrResult= axMiDocView1.TextSelection.Text.ToString();
   到这里就可以得到图片文件中所包含的文字了。这里选择图一中的拷贝文字到剪贴板后,将文字拷贝到文本文件中,效果如下图所示:
  MODI

  图2 图像文字识别结果

         也可通过以下途径实现: 

// 引用 Interop.MODI.dll
// 识别率不是很高
private string OcrFunc(string imgfileName) // 参数为包含文本的图片文件名
{
    var langs = MODI.MiLANGUAGES.miLANG_ENGLISH;
    // MODI.MiLANGUAGES.miLANG_CHINESE_SIMPLIFIED; 中文含英文
    // MODI.MiLANGUAGES.miLANG_JAPANESE; 日文含英文

    var doc = new MODI.Document();
    var image = default(MODI.Image);
    var layout = default(MODI.Layout);

    try
    {
        doc.Create(imgfileName);
        doc.OCR(langs, true, true);
        var sb = new StringBuilder();

        for (int i = 0; i < doc.Images.Count; i++)
        {
            image = (MODI.Image)doc.Images[i];
            layout = image.Layout;
            sb.AppendLine(string.Format("{0}, {1}", i, layout.Text));
        }
        doc.Close(false);
        return sb.ToString();
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
        return string.Empty;
    }
    finally
    {
        layout = null;
        image = null;
        doc = null;
    }
}

  3、 结果分析及其结论
  运用Office中自带的MODI组件,可以快速而有效的编写相关的OCR,但是识别精度和图片文档的质量与清晰度有关。运用MODI就可以很轻松的开发出很专业的OCR 程序,既节约了时间,又节约了成本。


2、

图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号。

 

图片识别的用途:很多人用它去破解网站的验证码,用于达到自动刷票或者是批量注册的目的,但我觉得它最吸引我的地方是可以让一些书写的东西,自动识别成电脑上的文字,比如说手拟的合同,修改过的书面论文或者是文档,每月的花费发票需要在电脑上录入或者是汇总信息,日记本上的文章要转移到电脑上等等,我们现在就不用再头痛把它们在电脑上敲写一遍了。

 

 

本文介绍两种比较主流和成熟的识别方式:

方式一、Asprise-OCR实现。

方式二、Microsoft Office Document Imaging(Office 2007) 组件实现。

 

方式一、Asprise-OCR的使用。

Asprise-OCR下载地址:

http://asprise.com/product/ocr/download.php?lang=csharp

其中需要使用的3个dll是AspriseOCR.dll、DevIL.dll、ILU.dll。

需要注意的是这几个.dll是vc写的引用要在程序中用DllImport引用,关键代码:

[DllImport("AspriseOCR.dll", EntryPoint = "OCR", CallingConvention = CallingConvention.Cdecl)]

public static extern IntPtr OCR(string file, int type);

[DllImport("AspriseOCR.dll", EntryPoint = "OCRpart", CallingConvention = CallingConvention.Cdecl)]

static extern IntPtr OCRpart(string file, int type, int startX, int startY, int width, int height);

[DllImport("AspriseOCR.dll", EntryPoint = "OCRBarCodes", CallingConvention = CallingConvention.Cdecl)]

static extern IntPtr OCRBarCodes(string file, int type);

[DllImport("AspriseOCR.dll", EntryPoint = "OCRpartBarCodes", CallingConvention = CallingConvention.Cdecl)]

static extern IntPtr OCRpartBarCodes(string file, int type, int startX, int startY, int width, int height);

 

调用代码很简单只有一句:

MessageBox.Show(Marshal.PtrToStringAnsi(OCRpart(img_path, -1, startX, startY, width, height)));

其中img_path:为图片路径,startX、startY坐标均为0即可,width、height图片的宽和高。

 

方式二、Microsoft Office Document Imaging(Office 2007) 组件实现。

在使用之前需要给大家说的是Imaging 组件的兼容性不是很好,使用win 7 office 2007的时必须打上office 2007 sp1或者sp2补丁,读取中文才行。

sp1补丁地址(226M) :

http://download.microsoft.com/download/1/6/5/1659d607-8696-4001-8072-efaedd70dd30/office2007sp1-kb936982-fullfile-zh-cn.exe

sp2补丁地址(301 MB):

http://download.microsoft.com/download/A/3/9/A39E919E-AFA8-4128-9249-51629206C70F/office2007sp2-kb953195-fullfile-zh-cn.exe

 

给项目添加组件引用,如图:

 

使用代码:

MODI.Document doc = new MODI.Document();

doc.Create(img_Path);

MODI.Image image;

MODI.Layout layout;

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;

    sb.Append(layout.Text);

}

MessageBox.Show(sb.ToString());

其中img_Path为图片路径,MODI.MiLANGUAGES为读取图片的文字类型枚举。

 

本文源码下载地址:http://files.cnblogs.com/stone_w/OCR.rar


3、c#调用dll 实现图像文字识别

请先下载http://asprise.com/product/ocr/index.php?lang=csharp 的SDK.里面提供了详细的OCR方法,如下:

将发现图像框picbVeryfyCode里的文字和文本框.txtVeryfyCode.Text是一致的.

数字识别率我碰到的几乎是100%

[DllImport("AspriseOCR.dll")]
  static extern string craboOCR(string file, int type);

private void GetVeryfyCode()
  {
if(File.Exists(_imgPath))//ok now?
   {
    try
    {
    this.picbVeryfyCode.Image=System.Drawing.Bitmap.FromFile(_imgPath);
     _veryfyCode=craboOCR(_imgPath,-1);   //将返回string,并以"\r\n"结尾!!
     _veryfyCode=_veryfyCode.Substring(0,4);
     this.txtVeryfyCode.Text=_veryfyCode;
    }
    catch(Exception e)
    {
     this.lblResult.Text+=e.Message;
    }
   }
}



0 0
原创粉丝点击