欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#身份证识别相关技术功能详解

程序员文章站 2023-12-02 23:13:52
最近研究c#相关的ocr技术,图像识别一般c和c++这种底层语言做的比较多,c#主要是依托一些封装好的组件进行调用,这里介绍一种身份证识别的方法。 环境搭建 下载地址:...

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

环境搭建

下载地址:emgucv官网

C#身份证识别相关技术功能详解

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

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

demo

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

C#身份证识别相关技术功能详解

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

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)
  {

  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。