C# WINFORM OCR识别功能

组件--- 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 

使用 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 

使用 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 

使用 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引擎
http://www.microsoft.com/downloads/thankyou.aspx?familyId=dd172063-9517-41d8-82af-29c38f7437b6&displayLang=zh-hk
 
 
另外一种方法,可以到http://asprise.com/product/ocr/download.php?lang=csharp
下载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 ;
}
demo下载http://www.madcn.net/uploadfile/OCR.Tesseract.Demo1.rar

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

转载于:http://blog.itpub.net/23109131/viewspace-687685/

你可能感兴趣的:(C# WINFORM OCR识别功能)