zoukankan      html  css  js  c++  java
  • C#识别图片上的数字

    通过Emgu实现对图片上的数字进行识别。
    前期步骤:
    1.下载Emgu安装文件,我的版本是2.4.2.1777。3.0版本则实现对中文的支持。
    2.安装后需填写环境变量,环境变量Path值后加入Emgu安装路径到bin下。如C:Emguemgucv-windows-x86-gpu 2.4.2.1777in;
    3.在bin下查找需要的dll如Emgu.CV.dll与Emgu.CV.OCR.dll等。
    4.将C:Emguemgucv-windows-x86-gpu 2.4.2.1777in下的文件夹tessdata赋值到程序运行目录下。
    注:安装后的Emgu路径下有C#版本的demo可供参考
    关键代码:
    将需要的dll导入到项目中。

    private static Tesseract _ocr;//创建识别对象
    //传入图片进行识别
    public static string ORC_(Bitmap img)
    {
        //""标示OCR识别调用失败
        string re = "";
        if (img == null)
            return re;
        else
        {
    
    
            Bgr drawColor = new Bgr(Color.Blue);
            try
            {
                Image<Bgr, Byte> image = new Image<Bgr, byte>(img);
    
    
                using (Image<Gray, byte> gray = image.Convert<Gray, Byte>())
                {
                    _ocr.Recognize(gray);
                    Tesseract.Charactor[] charactors = _ocr.GetCharactors();
                    foreach (Tesseract.Charactor c in charactors)
                    {
                        image.Draw(c.Region, drawColor, 1);
                    }
    
    
                    re = _ocr.GetText();
    
    
                }
                return re;
            }
            catch (Exception ex)
            {
    
                return re;
            }
        }
    }
    
    //识别方法如点击按钮识别
    private void btnXIdentification_Click(object sender, EventArgs e)
    {
        try
        {
            _ocr = new Tesseract(@"C:Emguemgucv-windows-x86-gpu 2.4.2.1777in	essdata", "eng", Tesseract.OcrEngineMode.OEM_TESSERACT_CUBE_COMBINED);//方法第一个参数可为""表示通过环境变量调用字库,第二个参数表示字库的文件,第三个表示识别方式,可看文档与资料查找。
            _ocr.SetVariable("tessedit_char_whitelist", "0123456789X");//此方法表示只识别1234567890与x字母
            string result = "";
            Bitmap bitmap = new Bitmap(_emguImage.ToBitmap());
            bitmap = BrightnessP(bitmap, Convert.ToInt32(this.textBoxX3.Text));//图片加亮处理
            bitmap = KiContrast(bitmap, Convert.ToInt32(this.textBoxX2.Text));//调整对比对
            this.pictureBox3.Image = bitmap;
            result = ORC_(bitmap);
            this.textBoxX1.Text = result;
            _ocr.Dispose();
        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.Message);
        }
    }
    
    /// <summary>  
    /// 增加图像亮度  
    /// </summary>  
    /// <param name="a"></param>  
    
    /// <param name="v"></param>  
    /// <returns></returns>  
    public static Bitmap BrightnessP(Bitmap a, int v)
    {
        System.Drawing.Imaging.BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        int bytes = a.Width * a.Height * 3;
        IntPtr ptr = bmpData.Scan0;
        int stride = bmpData.Stride;
        unsafe
        {
            byte* p = (byte*)ptr;
            int temp;
            for (int j = 0; j < a.Height; j++)
            {
                for (int i = 0; i < a.Width * 3; i++, p++)
                {
                    temp = (int)(p[0] + v);
                    temp = (temp > 255) ? 255 : temp < 0 ? 0 : temp;
                    p[0] = (byte)temp;
                }
                p += stride - a.Width * 3;
            }
        }
        a.UnlockBits(bmpData);
        return a;
    }
    ///<summary>
    ///图像对比度调整
    ///</summary>
    ///<param name="b">原始图</param>
    ///<param name="degree">对比度[-100, 100]</param>
    ///<returns></returns>
    public static Bitmap KiContrast(Bitmap b, int degree)
    {
        if (b == null)
        {
            return null;
        }
        if (degree < -100) degree = -100;
        if (degree > 100) degree = 100;
        try
        {
            double pixel = 0;
            double contrast = (100.0 + degree) / 100.0;
            contrast *= contrast;
            int width = b.Width;
            int height = b.Height;
            BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            unsafe
            {
                byte* p = (byte*)data.Scan0;
                int offset = data.Stride - width * 3;
                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        // 处理指定位置像素的对比度
                        for (int i = 0; i < 3; i++)
                        {
                            pixel = ((p / 255.0 - 0.5) * contrast + 0.5) * 255;
                            if (pixel < 0) pixel = 0;
                            if (pixel > 255) pixel = 255;
                            p = (byte)pixel;
                        } // i
                        p += 3;
                    } // x
                    p += offset;
                } // y
            }
            b.UnlockBits(data);
            return b;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

    目前我只是识别文字与字幕,3.0版本虽然可以识别中文,但误读率实在不敢恭维。
    本文如有错误之处请提出,灰常感谢!

    转自:http://www.sufeinet.com/thread-6690-1-1.html

  • 相关阅读:
    单元测试多租户数据库提供商
    在ASP.NET Core上实施每个租户策略的数据库
    再起航,我的学习笔记之JavaScript设计模式30(简单模板模式)
    再起航,我的学习笔记之JavaScript设计模式29(节流模式)
    笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
    再起航,我的学习笔记之JavaScript设计模式28(委托模式)
    笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
    再起航,我的学习笔记之JavaScript设计模式27(链模式)
    再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
    再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)
  • 原文地址:https://www.cnblogs.com/Tinoloving/p/4692663.html
Copyright © 2011-2022 走看看