C#识别图片上的数字

通过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导入到项目中。

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:\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版本虽然可以识别中文,但误读率实在不敢恭维。
本文如有错误之处请提出,灰常感谢!

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

时间: 2024-10-29 04:06:55

C#识别图片上的数字的相关文章

分享C#识别图片上的数字

通过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下的

c#实现识别图片上的验证码数字

这篇文章主要介绍了c#实现识别图片上的验证码数字的方法,本文给大家汇总了2种方法,有需要的小伙伴可以参考下. public void imgdo(Bitmap img) { //去色 Bitmap btp = img; Color c = new Color(); int rr, gg, bb; for (int i = 0; i < btp.Width; i++) { for (int j = 0; j < btp.Height; j++) { //取图片当前的像素点 c = btp.Get

python 图片上添加数字源代码

最近因工作需要,需要在图片上添加数字,查询了资料,自己写了一个方法,并进行了测试,由于代码用到了PIL库,需要下载安装,下载地址:http://www.pythonware.com/products/pil/,下载Imaging-1.1.7.tar.gz后解压得到,Imaging-1.1.7,在命令行下运行setup.py进行安装 具体实现代码如下: # -*- coding: utf-8 -*-import PILfrom PIL import ImageFontfrom PIL import

Python3.x:如何识别图片上的文字

Python3.x:如何识别图片上的文字 一.安装第三方库(pillow.pytesseract) pip install pillow pip install pytesseract 二.安装识别引擎tesseract-ocr 下载地址(解压安装): 原文地址:https://www.cnblogs.com/lizm166/p/8331398.html

识别图片上的一维码信息

识别图片上的一维码信息先需要引用一个DLL文件zxing.dll文件 你可以在扩展与跟新里面将这个添加,也可以通过这个地址 https://code.msdn.microsoft.com/ZXINGNET-QRCode-Generator-05128cfb?SRC=VSIDE 下载dll文件. 文件下载完毕之后将dll引用. 这两个dll都需要引用. 好了,我们引用玩了可以调用了.调用其实很简单. 第一步,实例化. 第二步,调用方法. this.BackgroundImage是一张Image图片

如何用手机去识别图片上的文字?

在当今这个时代,我们经常会使用手机去拍摄一些图片,这样就可以保存一些东西了.小编经常会拍摄一些学习的东西,这样的会更方便一些.时间久了,图片可能因为占用了太多的空间会被我们删除,但是我们记录的内容就没有了.小编在这里就分享给大家一个用手机去识别图片上文字的操作. 第一步:首先,我们需要打开手机上的OCR文字识别软件,进入到功能选择的页面. 第二步:在功能选择的页面里点击上传图片识别,会访问我们的相册,从我们的相册里选择需要识别的图片. 第三步:把我们要识别的图片添加进去,点击"立即识别"

识别图片上文字的软件

在上海这样的大城市想要生存下去不仅要过硬的知识基础,还要紧跟时代的脚步,不然随时都可能被淘汰.同一职位可以有巨大的差距,有的前台每天就只是做着可有可无的工作,每天接收到文件就直接发给需要的部门,这样的人员就算哪一天帮你不再了对公司也没有任何的影响,各部门自己接受一下就是.但是如果是这样一位前台,每天会按照你需要的要求把接收到的文件做好处理,拿到文件直接就能够使用,就拿扫描文件来说,前台收到的时候会帮你转换成word,这样使用的时候就能够直接使用,有一天前台不在,你拿到的是扫描文件,是不是会非常的

生成本地难码图片并在本地记录图片上的数字以作比较

1.用法 Bitmap valimg = new CreateValiImage(this).onDraw(); public class CreateValiImage { private Paint paint; private Canvas canvas; private float width; private float height; private int retate = 6; private SharedUtils sharedUtils; private Context co

如何快速识别提取图片上的文字

我们在日常工作中,我们经常会遇到将图片上文字转换成Word文档这样的情况,要知道, 图片上的文字是不能直接复制的,这是一件令人头疼的一件事情.那么要怎样才能快速的 提取这些图片的文字呢? 快速识别提取图片上的的文字的方法--迅捷文字识别小程序 1.首先打开手机微信,在微信上搜索迅捷文字识别,这是一个可以快速识别图片上 的文字的小程序,是一个比较智能的工具. 2.找到小程序之后,点击进入小程序的主界面,点击"照片/拍照". 3.再点击"选择图片". 4.选择一张你手机