asp.net的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();

            md.Create(Directory.GetCurrentDirectory() + "\\SampleForOCR.tiff");

            md.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

            MODI.Image image = (MODI.Image)md.Images[0];

            MODI.Layout layout = image.Layout;

            MODI.Word word;

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < layout.Words.Count;i++ )

            {

                word = (MODI.Word)layout.Words[i];

                sb.Append(word.Text);

            }

sb.ToString就可以得到了

图片转成 tiff

Bitmap bitmap = new Bitmap(100, 100);

            bitmap.Save("somefilename", ImageFormat.Tiff);

如何进行截屏呢?

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

Graphics g = Graphics.FromImage(m_WindowDlg.m_objBitmap);

            // Copy the screen into the bitmap object.

            g.CopyFromScreen(0, 0, 0, 0, new Size(w, h));

指定区域是利用

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

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

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

主要代码

// Make sure we clicked the mouse button and

            //   have a starting coordinate.

            if (m_nStartX != -1)

            {

                // Get the graphcis object from this window.

                Graphics g = Graphics.FromHwnd(Handle);

                // Check to see if we need to restore the

                //   screen from a previous rectangle draw.

                if (m_nLastX != -1)

                {

                    // Create a rectangle with which to clip.

                    //   Note that we are 3 pixels to the left

                    //   and 3 pixels to the right so that we

                    //   can take the width of the line into

                    //   account.

                    Rectangle rc = new Rectangle(m_nLastX-3, m_nLastY-3,

                        m_nLastWidth+6, m_nLastHeight+6);

                    g.SetClip(rc);

                    g.DrawImage(m_objBitmap, 0, 0);

                    g.ResetClip();

                }

                // Here we set some local variables just

                //   in case we have to swap the values.

                int nStartX = m_nStartX;

                int nStartY = m_nStartY;

                // Get and record our current mouse position.

                int nEndX = e.X;

                int nEndY = e.Y;

                // Calculate width and height.

                int nWidth = Math.Abs(nStartX - nEndX);

                int nHeight = Math.Abs(nStartY - nEndY);

                // We may need to swap values if user went

                //   left from the start position.

                if (nEndX < nStartX)

                {

                    int i = nStartX;

                    nStartX = nEndX;

                    nEndX = i;

                }

                // We may need to swap values if user went

                //   up from the start position.

                if (nEndY < nStartY)

                {

                    int i = nStartY;

                    nStartY = nEndY;

                    nEndY = i;

                }

                // Draw the rectangle.

                g.DrawRectangle(new Pen(Color.Black, 3),

                    nStartX, nStartY, nWidth, nHeight);

                // Record the operation so that we can restore

                //   when the mouse moves, and also give values

                //   to the EndCapture method.

                m_nLastX = nStartX;

                m_nLastY = nStartY;

                m_nLastWidth = nWidth;

                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;
    }
   }
}
 
第三种方法
程序使用google的Tesseract进行图片识别,其.NET版本地址为:http://www.pixel-technology.com/freeware/tessnet2/
private voidbtnGo_Click ( objectsender, EventArgs e )
{
    tessnet2 . Tesseractocr = newtessnet2 . Tesseract ( ) ; //声明一个OCR类
    stringdefaultCharList = "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 = newWebClient ( ) ;
    byte [ ]oimg =wc . DownloadData (txtImageUrl . Text ) ; // 自己修改成要识别的地址吧
    Bitmap bp = newBitmap ( newMemoryStream (oimg ), true ) ; //识别图像
    Bitmap bp2 = newBitmap ( newMemoryStream (oimg ), true ) ;
    picBox1 . Image =bp2 ;
    //bp = ImageProcess.RemoveGreen(bp);
   //bp = ImageProcess.ToBW(bp);

    picBox2 . Image =bp ;

    List <tessnet2 . Word >result = newList <tessnet2 . Word > ( ) ;
    stringtxt = "" ;

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

    }


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

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

        picBox2 . Image =bp ;

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

    textBox1 . Text =txt ;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值