zoukankan      html  css  js  c++  java
  • 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)
            {
    
            }
        }
    }
  • 相关阅读:
    234. Palindrome Linked List(判断链表是否回文)
    141. Linked List Cycle(判断链表是否有环)
    第二届“中国高校计算机大赛-大数据挑战赛” 20名
    Spark集群 Python Package管理
    Android中单选框RadioButton的基本用法
    【Android】进程间通信IPC——Binder
    Spring Boot 集成 JWT 实现单点登录授权
    pythonGUI编程——Qt库(1)
    Android获取SD卡路径/内存的几种方法
    Android主题更换换肤
  • 原文地址:https://www.cnblogs.com/AlexZha/p/7171927.html
Copyright © 2011-2022 走看看