查看: 289|回复: 0

[ASP.NET教程] C#身份证识别相关技术功能详解

发表于 2018-2-10 08:00:07

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

环境搭建

下载地址:EmguCV官网

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

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

Demo

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using Emgu.CV;
  11. using Emgu.CV.OCR;
  12. using Emgu.CV.Structure;
  13. using System.IO;
  14. namespace EmguCV
  15. {
  16. public partial class Form1 : Form
  17. {
  18. Image<Gray, Byte> imageThreshold;
  19. public Form1()
  20. {
  21. InitializeComponent();
  22. pictureBox1.Enabled = false;
  23. }
  24. private void Form1_Load(object sender, EventArgs e)
  25. {
  26. }
  27. private void button1_Click(object sender, EventArgs e)
  28. {
  29. //第一个参数是语言包文件夹的地址,不写默认在执行文件夹下
  30. Tesseract _ocr = new Tesseract(@"", "chi_sim", OcrEngineMode.TesseractOnly);
  31. _ocr.SetImage(imageThreshold);
  32. _ocr.Recognize();
  33. String text = _ocr.GetUTF8Text();
  34. this.textBox1.Text = text;
  35. }
  36. private void pictureBox2_Click(object sender, EventArgs e)
  37. {
  38. OpenFileDialog of = new OpenFileDialog();
  39. of.Title = "请选择图片";
  40. if (of.ShowDialog() == DialogResult.OK)
  41. {
  42. string file = of.FileName;
  43. Image img = Image.FromFile(file);
  44. pictureBox1.Image = img;
  45. }
  46. Bitmap bitmap = (Bitmap)this.pictureBox1.Image;
  47. Image<Bgr, Byte> imageSource = new Image<Bgr, byte>(bitmap);
  48. Image<Gray, Byte> imageGrayscale = imageSource.Convert<Gray, Byte>();
  49. imageGrayscale = randon(imageGrayscale);
  50. imageThreshold = imageGrayscale.ThresholdBinary(new Gray(100), new Gray(255));
  51. this.pictureBox2.Image = imageThreshold.ToBitmap();
  52. }
  53. /// <summary>
  54. /// 旋转校正
  55. /// </summary>
  56. /// <param name="imageInput"></param>
  57. /// <returns></returns>
  58. private Image<Gray, Byte> randon(Image<Gray, Byte> imageInput)//图像投影旋转法倾斜校正子函数定义
  59. {
  60. int nwidth = imageInput.Width;
  61. int nheight = imageInput.Height;
  62. int sum;
  63. int SumOfCha;
  64. int SumOfChatemp = 0;
  65. int[] sumhang = new int[nheight];
  66. Image<Gray, Byte> resultImage = imageInput;
  67. Image<Gray, Byte> ImrotaImage;
  68. //20度范围内的调整
  69. for (int ang = -20; ang < 20; ang = ang + 1)
  70. {
  71. ImrotaImage = imageInput.Rotate(ang, new Gray(1));
  72. for (int i = 0; i < nheight; i++)
  73. {
  74. sum = 0;
  75. for (int j = 0; j < nwidth; j++)
  76. {
  77. sum += ImrotaImage.Data[i, j, 0];
  78. }
  79. sumhang[i] = sum;
  80. }
  81. SumOfCha = 0;
  82. for (int k = 0; k < nheight - 1; k++)
  83. {
  84. SumOfCha = SumOfCha + (Math.Abs(sumhang[k] - sumhang[k + 1]));
  85. }
  86. if (SumOfCha > SumOfChatemp)
  87. {
  88. resultImage = ImrotaImage;
  89. SumOfChatemp = SumOfCha;
  90. }
  91. }
  92. return resultImage;
  93. }
  94. private void pictureBox1_Click(object sender, EventArgs e)
  95. {
  96. }
  97. }
  98. }
复制代码

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

您可能感兴趣的文章:

  • 基于C#技术实现身份证识别功能


回复

使用道具 举报