• 技术文章 >后端开发 >C#.Net教程

    C#实现身份证识别功能的图文代码详解

    黄舟黄舟2017-07-17 11:02:35原创1411
    这篇文章主要介绍了C#身份证识别相关技术详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    最近研究C#相关的OCR技术,图像识别一般C和C++这种底层语言做的比较多,C#主要是依托一些封装好的组件进行调用,这里介绍一种身份证识别的方法。

    环境搭建

    下载地址:EmguCV官网

    在File类别下下载这个EXE,进行安装,安装后在目录下能找相应组件,还有些应用的案例。

    dll文件夹中的dll引用到C#项目中,x64,x86,tessdata对应OCR识别的类库和语言库,我tessdata中已添加中文语言包,将这三个文件夹放入程序执行文件夹中。

    Demo

    自己做的小Demo如图:身份证图片是百度上下载的

    不得不说这个类库唯一弊端就是文字识别率太低,图像识别效果也不太好

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using Emgu.CV;
    using Emgu.CV.OCR;
    using Emgu.CV.Structure;
    using System.IO;
    
    namespace EmguCV
    {
     public partial class Form1 : Form
     {
      Image<Gray, Byte> imageThreshold;
      public Form1()
      {
       InitializeComponent();
       pictureBox1.Enabled = false;
      }
    
      private void Form1_Load(object sender, EventArgs e)
      {
    
    
    
      }
    
      private void button1_Click(object sender, EventArgs e)
      {
       //第一个参数是语言包文件夹的地址,不写默认在执行文件夹下
       Tesseract _ocr = new Tesseract(@"", "chi_sim", OcrEngineMode.TesseractOnly);
       _ocr.SetImage(imageThreshold);
       _ocr.Recognize();
       String text = _ocr.GetUTF8Text();
       this.textBox1.Text = text;
      }
    
      private void pictureBox2_Click(object sender, EventArgs e)
      {
       OpenFileDialog of = new OpenFileDialog();
       of.Title = "请选择图片";
       if (of.ShowDialog() == DialogResult.OK)
       {
        string file = of.FileName;
        Image img = Image.FromFile(file);
        pictureBox1.Image = img;
       }
       Bitmap bitmap = (Bitmap)this.pictureBox1.Image;
       Image<Bgr, Byte> imageSource = new Image<Bgr, byte>(bitmap);
       Image<Gray, Byte> imageGrayscale = imageSource.Convert<Gray, Byte>();
       imageGrayscale = randon(imageGrayscale);
       imageThreshold = imageGrayscale.ThresholdBinary(new Gray(100), new Gray(255));
       this.pictureBox2.Image = imageThreshold.ToBitmap();
      }
      /// <summary>
      /// 旋转校正
      /// </summary>
      /// <param name="imageInput"></param>
      /// <returns></returns>
      private Image<Gray, Byte> randon(Image<Gray, Byte> imageInput)//图像投影旋转法倾斜校正子函数定义
      {
       int nwidth = imageInput.Width;
       int nheight = imageInput.Height;
       int sum;
       int SumOfCha;
       int SumOfChatemp = 0;
       int[] sumhang = new int[nheight];
       Image<Gray, Byte> resultImage = imageInput;
       Image<Gray, Byte> ImrotaImage;
       //20度范围内的调整
       for (int ang = -20; ang < 20; ang = ang + 1)
       {
        ImrotaImage = imageInput.Rotate(ang, new Gray(1));
        for (int i = 0; i < nheight; i++)
        {
         sum = 0;
         for (int j = 0; j < nwidth; j++)
         {
          sum += ImrotaImage.Data[i, j, 0];
         }
         sumhang[i] = sum;
        }
        SumOfCha = 0;
        for (int k = 0; k < nheight - 1; k++)
        {
         SumOfCha = SumOfCha + (Math.Abs(sumhang[k] - sumhang[k + 1]));
        }
        if (SumOfCha > SumOfChatemp)
        {
         resultImage = ImrotaImage;
         SumOfChatemp = SumOfCha;
        }
       }
       return resultImage;
      }
    
      private void pictureBox1_Click(object sender, EventArgs e)
      {
    
      }
     }
    }

    以上就是C#实现身份证识别功能的图文代码详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:csharp .net 身份证
    上一篇:Windows服务在C#下如何创建(图)? 下一篇:C#中关于TCP粘包出现的问题解决的示例
    大前端线上培训班

    相关文章推荐

    • c++数组怎么初始化• 数组指针和指针数组的区别是什么• C++类型如何进行转换• C++中内存泄漏的检测• C# 2.0 Specification (泛型三)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网