http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 42961|回复: 13

[C#语言基础] 分享C#识别图片上的数字

[复制链接]
发表于 2013-11-15 11:16:51 | 显示全部楼层 |阅读模式
通过Emgu实现对图片上的数字进行识别。
前期步骤:
1.下载Emgu安装文件,我的版本是2.4.2.1777。3.0版本则实现对中文的支持。
2.安装后需填写环境变量,环境变量Path值后加入Emgu安装路径到bin下。如C:\Emgu\emgucv-windows-x86-gpu 2.4.2.1777\bin;
3.在bin下查找需要的dll如Emgu.CV.dll与Emgu.CV.OCR.dll等。
4.将C:\Emgu\emgucv-windows-x86-gpu 2.4.2.1777\bin下的文件夹tessdata赋值到程序运行目录下。
注:安装后的Emgu路径下有C#版本的demo可供参考
关键代码:
将需要的dll导入到项目中。
[C#] 纯文本查看 复制代码
private static Tesseract _ocr;//创建识别对象

[C#] 纯文本查看 复制代码
//传入图片进行识别
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:\Emgu\emgucv-windows-x86-gpu 2.4.2.1777\bin\tessdata", "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版本虽然可以识别中文,但误读率实在不敢恭维。
本文如有错误之处请提出,灰常感谢!


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-11-15 11:38:13 | 显示全部楼层
OEM_TESSERACT_ONLY,           // Run Tesseract only - fastest运行只TESSERACT - 最快
OEM_CUBE_ONLY,                // Run Cube only - better accuracy, but slower只运行立方 - 更好的精度,但速度较慢
OEM_TESSERACT_CUBE_COMBINED,  // Run both and combine results - best accuracy运行和结果相结合 - 最佳精度
OEM_DEFAULT                   // Specify this mode when calling init_*(),指定此模式下,当调用init_*(),
发表于 2013-11-15 11:39:52 | 显示全部楼层
受教了,学习中……
发表于 2013-11-15 11:40:03 | 显示全部楼层
受教了,学习中……
发表于 2013-11-15 20:46:29 | 显示全部楼层
有直接的识别 的源码吗
发表于 2014-2-2 02:22:45 | 显示全部楼层
这个的意思,是识别验证码吗?
发表于 2014-3-29 21:51:11 | 显示全部楼层
受教了,学习中。。。
发表于 2014-3-30 16:35:05 | 显示全部楼层
楼主的Emgu内核是不是就是Tesseract,网上直接可以找到Tesseract的源码。
已经封装好了,调用非常简单:
[C#] 纯文本查看 复制代码
            //    using (Tesseract31 ocr = new Tesseract31())
            //    {
            //        ocr.Init(IMG_FOLDER_NAME + IMG_FILE_NAME + ".jpg");
            //        ocr.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
            //        string res = ocr.DoOCR();
 }
发表于 2014-4-28 11:03:10 | 显示全部楼层
这个是个好东西      啊
发表于 2014-7-22 01:50:50 | 显示全部楼层
非常感谢你帮了我的大忙,真的太感谢你啦!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-16 02:40

© 2014-2021

快速回复 返回顶部 返回列表