ITPub博客

首页 > Linux操作系统 > Linux操作系统 > C# WINFORM OCR识别功能

C# WINFORM OCR识别功能

原创 Linux操作系统 作者:fangqm 时间:2011-02-22 13:13:49 0 删除 编辑
组件---Microsoft Office Document Imaging;这样就方便的做OCR识别了。
首先用office安装盘安装这个组件,默认安装office的时候是不会安装的,只要添加这个组件功能就好了。
然后新建的项目里添加组件Microsoft Office Document Imaging 12.0 Type Library(office07)或者Microsoft Office Document Imaging 11.0 Type Library(office03)
MODI.Document md = new MODI.Document();

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            md.Create(Directory.GetCurrentDirectory() + "\\SampleForOCR.tiff");

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            md.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            MODI.Image image = (MODI.Image)md.Images[0];

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            MODI.Layout layout = image.Layout;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            MODI.Word word;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            StringBuilder sb = new StringBuilder();

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            for (int i = 0; i < layout.Words.Count;i++ )

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂{

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                word = (MODI.Word)layout.Words[i];

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                sb.Append(word.Text);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            }

sb.ToString就可以得到了

图片转成 tiff

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂Bitmap bitmap = new Bitmap(100, 100);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            bitmap.Save("somefilename", ImageFormat.Tiff);

如何进行截屏呢?

拷屏.先把整个屏幕的图像拷过来(其它地方也会用到这个.比如做一个操作动作的外挂等)

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂Graphics g = Graphics.FromImage(m_WindowDlg.m_objBitmap);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            // Copy the screen into the bitmap object.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            g.CopyFromScreen(0, 0, 0, 0, new Size(w, h));

指定区域是利用

另一个窗口来的..把这个窗口的透明属性opacity设为100%这样人家就看不到了.

然后利用 MouseDown 画出我们截屏的范围 和 mouseUP事件.

mouseUP后引发一个完成的事件.并通知座标大小

主要代码

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂// Make sure we clicked the mouse button and

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            //   have a starting coordinate.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            if (m_nStartX != -1)

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂            使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂{

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Get the graphcis object from this window.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                Graphics g = Graphics.FromHwnd(Handle);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Check to see if we need to restore the

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                //   screen from a previous rectangle draw.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                if (m_nLastX != -1)

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂{

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    // Create a rectangle with which to clip.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    //   Note that we are 3 pixels to the left

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    //   and 3 pixels to the right so that we

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    //   can take the width of the line into

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    //   account.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    Rectangle rc = new Rectangle(m_nLastX-3, m_nLastY-3,

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                        m_nLastWidth+6, m_nLastHeight+6);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    g.SetClip(rc);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    g.DrawImage(m_objBitmap, 0, 0);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    g.ResetClip();

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                }

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Here we set some local variables just

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                //   in case we have to swap the values.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                int nStartX = m_nStartX;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                int nStartY = m_nStartY;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Get and record our current mouse position.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                int nEndX = e.X;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                int nEndY = e.Y;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Calculate width and height.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                int nWidth = Math.Abs(nStartX - nEndX);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                int nHeight = Math.Abs(nStartY - nEndY);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // We may need to swap values if user went

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                //   left from the start position.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                if (nEndX < nStartX)

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂{

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    int i = nStartX;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    nStartX = nEndX;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    nEndX = i;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                }

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // We may need to swap values if user went

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                //   up from the start position.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                if (nEndY < nStartY)

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂{

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    int i = nStartY;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    nStartY = nEndY;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    nEndY = i;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                }

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Draw the rectangle.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                g.DrawRectangle(new Pen(Color.Black, 3),

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                    nStartX, nStartY, nWidth, nHeight);

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                // Record the operation so that we can restore

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                //   when the mouse moves, and also give values

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                //   to the EndCapture method.

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                m_nLastX = nStartX;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                m_nLastY = nStartY;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                m_nLastWidth = nWidth;

使用 office2003 document imaging control 控件 做识别 OCR  - Jarod.Zero.D - 无道的自学天堂                m_nLastHeight = nHeight;

g.DrawRectangle(new Pen(Color.Red, 1), 这个改成红色一个像素看起来更舒服,这个函数是鼠标一移动都会被调用的.

 
 
核心代码如下:
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;
它识别英文和中文的正确率都还不错。要注意的是:如果要识别简体中文,你必须下载安装中文简体OCR引擎,微软官方下载地址:中文简体OCR引擎
 
 
下载C#的OCR识别模块
数字识别率我碰到的几乎是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;
    }
   }
}
 
第三种方法
程序使用Tesseract进行图片识别,其.NET版本地址为:http://www.pixel-technology.com/freeware/tessnet2/
private void btnGo_Click(object sender, EventArgs e)
{
    tessnet2.Tesseract ocr = new tessnet2.Tesseract();//声明一个OCR类
    string defaultCharList="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-";
    if (!string.IsNullOrEmpty(txtCharList.Text))
    {
        defaultCharList = txtCharList.Text;
    }
    ocr.SetVariable("tessedit_char_whitelist", defaultCharList);//设置识别变量,当前只能识别数字及英文字符。
    ocr.Init(Application.StartupPath + @"\tessdata", "eng", false); //应用当前语言包。注,Tessnet2是支持多国语的。语言包下载链接:http://code.google.com/p/tesseract-ocr/downloads/list

    WebClient wc = new WebClient();
    byte[] oimg = wc.DownloadData(txtImageUrl.Text); // 自己修改成要识别的地址吧
    Bitmap bp = new Bitmap(new MemoryStream(oimg), true);//识别图像
    Bitmap bp2 = new Bitmap(new MemoryStream(oimg), true);
    picBox1.Image = bp2;
    //bp = ImageProcess.RemoveGreen(bp);
    //bp = ImageProcess.ToBW(bp);

    picBox2.Image = bp;

    List<tessnet2.Word> result = new List<tessnet2.Word>();
    string txt = "";

    try
    {
        result = ocr.DoOCR(bp, Rectangle.Empty);//执行识别操作
        foreach (tessnet2.Word word in result)//遍历识别结果。
        {
            txt += word.Text;
        }
    }
    catch (Exception ex)
    {

    }


    if (string.IsNullOrEmpty(txt) || txt == "~")
    {
        #region 如图片太小,无法识别,则先放大
        int w = bp.Width >= 100 ? bp.Width : 100;
        int h = bp.Height >= 30 ? bp.Height : 30;

        Bitmap resizedBmp = new Bitmap(w, h);
        Graphics g = Graphics.FromImage(resizedBmp);
        g.DrawImage(bp, new Rectangle(0, 0, w, h), new Rectangle(0, 0, bp.Width, bp.Height), GraphicsUnit.Pixel);
        bp = resizedBmp;
        #endregion

        picBox2.Image = bp;

        result = ocr.DoOCR(bp, Rectangle.Empty);//执行识别操作
        txt = "";
        foreach (tessnet2.Word word in result)//遍历识别结果。
        {
            txt += word.Text;
        }
    }

    textBox1.Text = txt;
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23109131/viewspace-687685/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-24

  • 博文量
    298
  • 访问量
    729579