在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#车牌识别源代码

C#车牌识别源代码

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:16.70M
  • 下载次数:702
  • 浏览次数:6042
  • 发布时间:2018-12-01
  • 实例类别:C#语言基础
  • 发 布 人:namehehe
  • 文件格式:.zip
  • 所需积分:5
 相关标签: C# c 识别 源代码 代码

实例介绍

【实例简介】下图是 车牌的 识别结果

1、把MYsource放在G盘
2、运行环境是Net framework2.0
3、必须得有E盘
以上G盘E盘可以到程序里面改,很好找到的
此实例从别处获得,如果侵犯了您的权益,请联系作者上传者删除
【实例截图】

from clipboard


下图为原始车牌

from clipboard


from clipboard

【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;

using System.Drawing.Imaging;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace MyLPR
{
    public partial class MainForm : Form
    {
        private Bitmap m_Bitmap;//存放最先打开的图片
        private Bitmap always_Bitmap;//永远是彩色图片,用以备用
        private Bitmap other_c_Bitmap;
        private Bitmap extract_Bitmap_one;
        private Bitmap extract_Bitmap_two;
        private Bitmap z_Bitmap0;
        private Bitmap z_Bitmap1;
        private Bitmap z_Bitmap2;
        private Bitmap z_Bitmap3;
        private Bitmap z_Bitmap4;
        private Bitmap z_Bitmap5;
        private Bitmap z_Bitmap6;
        //private Bitmap z_Bitmap7;
        private Bitmap objNewPic;
        private Bitmap c_Bitmap;//车牌图像

        private Bitmap[] z_Bitmaptwo = new Bitmap[7];//用于储存最终的黑白字体

        private Bitmap[] charFont;
        private Bitmap[] provinceFont;
        string[] charString;//存储的路径
        string[] provinceString;//省份字体
        string[] charDigitalString;
        string[] provinceDigitalString;
        Pen pen1 = new Pen(Color.Black);
        private String name;
        private float count;
        private float[] gl = new float[256];
        int[] gray = new int[256];
        int[] rr = new int[256];
        int[] gg = new int[256];
        int[] bb = new int[256];
        float[,] m = new float[5000, 5000];
        int flag = 0, flag1 = 0;
        int xx = -1;
        //private bool aline = false;
        public static string SourceBathOne = "D:\\licensePlate\\";//备用
        public static string charSourceBath = "d:\\MYsource\\char\\";
        public static string provinceSourceBath = "D:\\MYsource\\font\\";
        public MainForm()
        {
            
            other_c_Bitmap = new Bitmap(2, 2);//暂时存放原图片
            extract_Bitmap_one = new Bitmap(2, 2);//

            InitializeComponent();
            //this.skinEngine1.SkinFile = "SportsBlack.ssk";
        }
        
        private string[,] _ChildModule;
        private int _ModuleButtonHeight = 30;
        private int _ChildButtonHeight = 25;
        private Bitmap singleBitmap = null;//特征训练的那个小图片
        private String bathFlag = null;//在特征入库是,标识应该入库的路径
        

        /// <summary>
        /// 初始子模块
        /// </summary>
        public string[,] ChildModule
        {
            get { return _ChildModule; }
            set { _ChildModule = value; }
        }
        //Bitmap _videoBitmap=null;
        public   Bitmap videoBitmap
        {
            get { return m_Bitmap; }
            set {
                    this.clearAllPanel();    
                    m_Bitmap = value;
                    Console.WriteLine(m_Bitmap.Width   "asdfghjkkl"   m_Bitmap.Height);
                    this.always_Bitmap = m_Bitmap.Clone(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), PixelFormat.DontCare);
                    this.label1.Text = "";
                    this.panel1.AutoScroll = true;
                    this.panel1.AutoScrollMinSize = new Size((int)(m_Bitmap.Width), (int)m_Bitmap.Height);
                    this.panel1.Invalidate();
                }
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
           // this.skinEngine1.SkinFile = "EmeraldColor1.ssk";

            toolTip1.SetToolTip(this.FontPanel1, "双击进行样本训练");
            toolTip1.SetToolTip(this.FontPanel2, "双击进行样本训练");
            toolTip1.SetToolTip(this.FontPanel3, "双击进行样本训练");
            toolTip1.SetToolTip(this.FontPanel4, "双击进行样本训练");
            toolTip1.SetToolTip(this.FontPanel5, "双击进行样本训练");
            toolTip1.SetToolTip(this.FontPanel6, "双击进行样本训练");
            toolTip1.SetToolTip(this.FontPanel7, "双击进行样本训练");

            ChildModule = new string[6, 4];
            ChildModule[0, 0] = "打开";
            ChildModule[0, 1] = "重新载入";
            ChildModule[0, 2] = "保存";
            ChildModule[0, 3] = "退出";

            ChildModule[1, 0] = "灰度化";
            ChildModule[1, 1] = "灰度均衡化";
            ChildModule[1, 2] = "中值滤波";
            ChildModule[1, 3] = "";

            ChildModule[2, 0] = "sobel边缘检测";
            ChildModule[2, 1] = "车牌定位";
            ChildModule[2, 2] = "";
            ChildModule[2, 3] = "";

            ChildModule[3, 0] = "灰度化";
            ChildModule[3, 1] = "二值化";
            ChildModule[3, 2] = "人工校正";
            ChildModule[3, 3] = "区域化";

            ChildModule[4, 0] = "车牌识别";
            ChildModule[4, 1] = "";
            ChildModule[4, 2] = "";
            ChildModule[4, 3] = "";

            ChildModule[5, 0] = "特征训练";
            ChildModule[5, 1] = "摄像头捕获";
            ChildModule[5, 2] = "一键识别";
            ChildModule[5, 3] = "";
           
        }
        private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void 车牌定位ToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

      
        private void button_Click(object sender, EventArgs e)
        {
            //标志是否找到用户点击的Button
            bool findOutStatus = false;

            //清除上一次操作加载的子菜单项
            for (int i = 0; i < this.ControlPanel.Controls.Count; i  )
            {
                if (this.ControlPanel.Controls[i].GetType().Name == "Panel")
                {
                    this.ControlPanel.Controls.RemoveAt(i);
                }
            }

            for (int i = 0; i < this.ControlPanel.Controls.Count; i  )
            {
                if (this.ControlPanel.Controls[i].GetType().Name == "Button")
                {
                    //重新定义各个button位置
                    if (!findOutStatus)
                    {
                        this.ControlPanel.Controls[i].Top = _ModuleButtonHeight * i;
                       
                    }
                    else
                    {
                        this.ControlPanel.Controls[i].Top = this.ControlPanel.Height - (_ModuleButtonHeight * (6 - i));
                        
                    }

                    //找到所点击的Button,在其下加载子菜单
                    if (this.ControlPanel.Controls[i].Name == ((Button)sender).Name)
                    {
                        findOutStatus = true;
                        // MessageBox.Show(((Button)sender).Name);

                        Panel panel = new Panel();
                        panel.BackColor = Color.AliceBlue;
                        panel.Top = _ModuleButtonHeight * (i   1);
                        panel.Width = this.ControlPanel.Width;
                        panel.Height = this.ControlPanel.Height - _ModuleButtonHeight * 6;
                        this.ControlPanel.Controls.Add(panel);

                        for (int j = 0; j < ChildModule.Length / 6; j  )
                        {
                            if (!string.IsNullOrEmpty(ChildModule[i, j]))
                            {
                                Button btn = new Button();
                                btn.FlatStyle = FlatStyle.Flat;
                                btn.Top = _ChildButtonHeight * j;
                                btn.Width = this.ControlPanel.Width-50;
                                btn.Left = 50;
                                btn.Height = _ChildButtonHeight;
                                btn.Name = string.Format("ChildButton{0}_{1}", i.ToString(), j.ToString());
                                //Console.WriteLine(btn.Name);
                                btn.Text = ChildModule[i, j];
                                if (i == 0)
                                {
                                    switch (j)
                                    { 
                                        case 0:
                                            btn.Click  = new EventHandler(文件_打开_Click); break;
                                        case 1:
                                            btn.Click  = new EventHandler(文件_重新载入_Click); break;
                                        case 2:
                                            btn.Click  = new EventHandler(文件_保存_Click); break;
                                        case 3:
                                            btn.Click =new EventHandler(文件_退出_Click);
                                            break;
                                        default:
                                            Console.WriteLine("switch !");
                                            break;
                                    }
                                }
                                  if (i == 1)
                                {
                                    switch (j)
                                    {
                                        case 0:
                                            btn.Click  = new EventHandler(t灰度化_Click); break;
                                        case 1:
                                            btn.Click  = new EventHandler(t灰度均衡化_Click); break;
                                        case 2:
                                            btn.Click  = new EventHandler(t高斯滤波_Click); break;
                                        case 3:
                                            break;
                                        default:
                                            break;
                                    }
                                }
                                if (i == 2)
                                {
                                    switch (j)
                                    {
                                        case 0:
                                            btn.Click  = new EventHandler(sobel边缘检测_Click); break;
                                        case 1:
                                            btn.Click  = new EventHandler(车牌定位_Click); break;
                                        case 2:

                                        case 3:

                                            break;
                                        default:
                                           // Console.WriteLine("switch !");
                                            break;
                                    }
                                }
                                if (i == 3)
                                {
                                    switch (j)
                                    {
                                        case 0:
                                            btn.Click  = new EventHandler(c灰度化_Click); break;
                                        case 1:
                                            btn.Click  = new EventHandler(c二值化_Click); break;
                                        case 2:
                                            btn.Click  = new EventHandler(c人工校正_Click); break;
                                        case 3:
                                            btn.Click  = new EventHandler(c区域化_Click); 
                                            break;
                                        default:
                                            //Console.WriteLine("switch !");
                                            break;
                                    }
                                }
                                if (i == 4)
                                {
                                    switch (j)
                                    {
                                        case 0:
                                            btn.Click  = new EventHandler(车牌识别_Click); break;
                                        case 1:
                                            btn.Click  = new EventHandler(摄像头捕获_Click); break;
                                        case 2:
                                            btn.Click  = new EventHandler(日志查询_Click); break;
                                        case 3:
                                            
                                            break;
                                        default:
                                            //Console.WriteLine("4switch !");
                                            break;
                                    }
                                }
                                if (i == 5)
                                {
                                    switch (j)
                                    {
                                        case 0:
                                            btn.Click  = new EventHandler(特征训练_Click); break;
                                        case 1:
                                            btn.Click  = new EventHandler(摄像头捕获_Click); break;
                                        case 2:
                                            btn.Click  = new EventHandler(一键识别_Click); break;

                                        case 3:
                                            btn.Click  = new EventHandler(一键识别_Click); break;
                                            
                                        default:
                                            //Console.WriteLine("4switch !");
                                            break;
                                    }
                                }
                               // btn.Click  = new EventHandler(btnChild_Click);
                                panel.Controls.Add(btn);
                            }
                        }
                    }
                }
            }
        }
       
       /***************************************各个按钮事件**************************************/

        //文件按钮事件
        private void 文件_打开_Click(object sender, EventArgs e)
        {
            this.文件_打开();

        }
       
        private void 文件_重新载入_Click(object sender, EventArgs e)
        {

            if (name != null)
            {
                //this.GraphyPanel.Dispose();

                this.clearAllPanel();
                m_Bitmap = (Bitmap)Bitmap.FromFile(name, false);
                panel1.Invalidate();//使panel1内的图像重新绘制

            }
        }
        private void 文件_保存_Click(object sender, EventArgs e)
        {

            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Bitmap文件(*.bmp)|*.bmp| Jpeg文件(*.jpg)|*.jpg| 所有合适文件(*.bmp/*.jpg)|*.bmp/*.jpg";
            saveFileDialog.FilterIndex = 1;
            saveFileDialog.RestoreDirectory = true;
            if (DialogResult.OK == saveFileDialog.ShowDialog())
            {
                c_Bitmap.Save(saveFileDialog.FileName);
            }
        }
        private void 文件_退出_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //车辆图片处理事件
        private void t灰度化_Click(object sender, EventArgs e)
        {

            t灰度化();

        }
        private void t灰度均衡化_Click(object sender, EventArgs e)
        {
            t灰度均衡化(); 
        }
        private void t高斯滤波_Click(object sender, EventArgs e)
        {
            t高斯滤波();
        }
       
        //定位处理事件
        private void sobel边缘检测_Click(object sender, EventArgs e)
        {
            sobel边缘检测();
        }
        private void 车牌定位_Click(object sender, EventArgs e)
        {
            //always_Bitmap = (Bitmap)Bitmap.FromFile(name, false);
            this.c_Bitmap = Recoginzation.licensePlateLocation(m_Bitmap, always_Bitmap, m);
            extract_Bitmap_one = c_Bitmap.Clone(new Rectangle(0, 0, c_Bitmap.Width, c_Bitmap.Height), PixelFormat.DontCare);
            this.panel1.Invalidate();
            this.LocatedPanel.Invalidate();
            this.ExtractPanel.Invalidate();
        }
        //车牌处理事件
        private void c灰度化_Click(object sender, EventArgs e)
        {
            c灰度化();

        }
        private void c二值化_Click(object sender, EventArgs e)
        {
            c二值化();
        }
        private void c人工校正_Click(object sender, EventArgs e)
        {
            rotation rotForm = new rotation();
            Console.WriteLine("ren gong jiao zheng");
            if (rotForm.ShowDialog() == DialogResult.OK)
            {
                int degree = Convert.ToInt32(rotForm.GetDegree);
                this.c_Bitmap = GeneralTools.artificialController(c_Bitmap, extract_Bitmap_one, degree);
            }
            Rectangle sourceRectangle1 = new Rectangle(0, 0, c_Bitmap.Width, c_Bitmap.Height);

            extract_Bitmap_one = c_Bitmap.Clone(sourceRectangle1, PixelFormat.DontCare);
            LocatedPanel.Invalidate();
            
        }
        private void c区域化_Click(object sender, EventArgs e)
        {
            Accuracy();
        }
        //车牌识别事件
        private void 车牌识别_Click(object sender, EventArgs e)
        {
            MaptoCharReg();
        }
        //其他工具事件
        private void 特征训练_Click(object sender, EventArgs e)
        {
            Console.WriteLine("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
            PictureTakeForm ptf = new PictureTakeForm();

            ptf.Show();
        }
        private void 摄像头捕获_Click(object sender, EventArgs e)
        {
            Camera camera = new Camera(this);
            camera.Show();
            //Console.WriteLine("she xiang tou buhuo");
        }
        private void 日志查询_Click(object sender, EventArgs e)
        {
            
        }
        private void 一键识别_Click(object sender, EventArgs e)
        {
            this.t灰度化();
           this.t灰度均衡化();
            t高斯滤波();
            sobel边缘检测();
            车牌定位();
            c灰度化();
            c二值化();
            Accuracy();
            MaptoCharReg();
        }


        /***************************************************************************/

        //车辆图片处理事件
        private void t灰度化()
        {

            if (m_Bitmap != null)
            {
                int tt = 0;
                for (int i = 0; i < 256; i  )//清掉数组gray里的数据
                {
                    gray[i] = 0;
                }
                for (int i = 0; i < 256; i  )//清掉数组rr里的数据
                {
                    rr[i] = 0;
                }
                for (int i = 0; i < 256; i  )//清掉数组gg里的数据
                {
                    gg[i] = 0;
                }
                for (int i = 0; i < 256; i  )//清掉数组bb里的数据
                {
                    bb[i] = 0;
                }
                BitmapData bmData = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                int stride = bmData.Stride;//获取或设置 Bitmap 对象的跨距宽度(也称为扫描宽度)。 
                System.IntPtr Scan0 = bmData.Scan0;//获取或设置位图中第一个像素数据的地址。 它也可以看成是位图中的第一个扫描行
                unsafe
                {
                    byte* p = (byte*)(void*)Scan0;
                    int nOffset = stride - m_Bitmap.Width * 3;
                    byte red, green, blue;
                    int nWidth = m_Bitmap.Width;
                    int nHeight = m_Bitmap.Height;
                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            blue = p[0];
                            green = p[1];
                            red = p[2];
                            tt = p[0] = p[1] = p[2] = (byte)(.299 * red   .587 * green   .114 * blue);
                            rr[red]  ;
                            gg[green]  ;
                            bb[blue]  ;
                            gray[tt]  ;   //统计灰度值为tt的象素点数目  
                            p  = 3;
                        }
                        p  = nOffset;
                    }
                }
                m_Bitmap.UnlockBits(bmData);
                flag = 1;
                graydo();
            }

        }
        private void t灰度均衡化()
        {

            if (m_Bitmap != null)
            {
                BitmapData bmData = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                //加入内存进行处理
                int stride = bmData.Stride;
                System.IntPtr Scan0 = bmData.Scan0;//扫描的第一行
                int tt = 0;
                int[] SumGray = new int[256];
                for (int i = 0; i < 256; i  )
                {
                    SumGray[i] = 0;
                }
                unsafe
                {
                    byte* p = (byte*)(void*)Scan0;
                    int nOffset = stride - m_Bitmap.Width * 3;
                    int nHeight = m_Bitmap.Height;
                    int nWidth = m_Bitmap.Width;
                    SumGray[0] = gray[0];//灰度均衡化 
                    for (int i = 1; i < 256;   i)//灰度级频度数累加                         
                        SumGray[i] = SumGray[i - 1]   gray[i];
                    for (int i = 0; i < 256;   i) //计算调整灰度值     频率乘以灰度总级数得出该灰度变换后的灰度级                   
                        SumGray[i] = (int)(SumGray[i] * 255 / count);
                    for (int i = 0; i < 256; i  )
                    {
                        gray[i] = 0;
                    }
                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            tt = p[0] = p[1] = p[2] = (byte)(SumGray[p[0]]);
                            gray[tt]  ;
                            p  = 3;
                        }
                        p  = nOffset;
                    }
                }
                m_Bitmap.UnlockBits(bmData);
                flag = 1;
                graydo();
            }
        }
        private void t高斯滤波()
        {
            if (m_Bitmap != null)
            {
                BitmapData bmData = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                for (int i = 0; i < 256; i  )
                {
                    gray[i] = 0;
                }
                unsafe
                {
                    int stride = bmData.Stride;
                    System.IntPtr Scan0 = bmData.Scan0;
                    byte* p = (byte*)(void*)Scan0;
                    byte* pp;
                    int tt;
                    int nOffset = stride - m_Bitmap.Width * 3;
                    int nWidth = m_Bitmap.Width;
                    int nHeight = m_Bitmap.Height;
                    long sum = 0;
                    int[,] gaussianMatrix = { { 1, 2, 3, 2, 1 }, { 2, 4, 6, 4, 2 }, { 3, 6, 7, 6, 3 }, { 2, 4, 6, 4, 2 }, { 1, 2, 3, 2, 1 } };//高斯滤波器所选的n=5模板
                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            if (!(x <= 1 || x >= nWidth - 2 || y <= 1 || y >= nHeight - 2))
                            {
                                pp = p;
                                sum = 0;
                                int dividend = 79;
                                for (int i = -2; i <= 2; i  )
                                    for (int j = -2; j <= 2; j  )
                                    {
                                        pp  = (j * 3   stride * i);
                                        sum  = pp[0] * gaussianMatrix[i   2, j   2];
                                        if (i == 0 && j == 0)
                                        {
                                            if (pp[0] > 240)//如果模板中心的灰度大于240
                                            {
                                                sum  = p[0] * 30;
                                                dividend  = 30;
                                            }
                                            else if (pp[0] > 230)
                                            {
                                                sum  = pp[0] * 20;
                                                dividend  = 20;
                                            }
                                            else if (pp[0] > 220)
                                            {
                                                sum  = p[0] * 15;
                                                dividend  = 15;
                                            }
                                            else if (pp[0] > 210)
                                            {
                                                sum  = pp[0] * 10;
                                                dividend  = 10;
                                            }
                                            else if (p[0] > 200)
                                            {
                                                sum  = pp[0] * 5;
                                                dividend  = 5;
                                            }
                                        }
                                        pp = p;
                                    }
                                sum = sum / dividend;
                                if (sum > 255)
                                {
                                    sum = 255;
                                }
                                p[0] = p[1] = p[2] = (byte)(sum);
                            }
                            tt = p[0];
                            gray[tt]  ;
                            p  = 3;
                        }
                        p  = nOffset;
                    }
                }
                flag = 1;
                m_Bitmap.UnlockBits(bmData);
                graydo();
            }
        }

        //定位处理事件
        private void sobel边缘检测()
        {
            if (m_Bitmap != null)
            {
                BitmapData bmData = m_Bitmap.LockBits(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                float valve = 67;
                for (int i = 0; i < 256; i  )
                {
                    gray[i] = 0;
                }
                unsafe
                {
                    int stride = bmData.Stride;
                    System.IntPtr Scan0 = bmData.Scan0;
                    byte* p = (byte*)(void*)Scan0;
                    byte* pp;
                    int tt;
                    int nOffset = stride - m_Bitmap.Width * 3;
                    int nWidth = m_Bitmap.Width;
                    int nHeight = m_Bitmap.Height;
                    int Sx = 0;
                    int Sy = 0;
                    //	float max = 0;
                    double sumM = 0;
                    double sumCount = 0;
                    int[] marginalMx = { -1, 0, 1, -2, 0, 2, -1, 0, 1 };   //sobel模板
                    int[] marginalMy = { 1, 2, 1, 0, 0, 0, -1, -2, -1 };
                    int[,] dlta = new int[nHeight, nWidth];
                    for (int y = 0; y < nHeight;   y)      //sobel算子
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            if (!(x <= 0 || x >= nWidth - 1 || y <= 0 || y >= nHeight - 1))
                            {
                                pp = p;
                                Sx = 0;
                                Sy = 0;
                                for (int i = -1; i <= 1; i  )
                                    for (int j = -1; j <= 1; j  )
                                    {
                                        pp  = (j * 3   stride * i);
                                        Sx  = pp[0] * marginalMx[(i   1) * 3   j   1];
                                        Sy  = pp[0] * marginalMy[(i   1) * 3   j   1];
                                        pp = p;
                                    }
                                m[y, x] = (int)(Math.Sqrt(Sx * Sx   Sy * Sy));
                                if (m[y, x] > valve / 2) //增强白点
                                {
                                    if (p[0] > 240)
                                    {
                                        m[y, x]  = valve;
                                    }
                                    else if (p[0] > 220)
                                    {
                                        m[y, x]  = (float)(valve * 0.8);
                                    }
                                    else if (p[0] > 200)
                                    {
                                        m[y, x]  = (float)(valve * 0.6);
                                    }
                                    else if (p[0] > 180)
                                    {
                                        m[y, x]  = (float)(valve * 0.4);
                                    }
                                    else if (p[0] > 160)
                                    {
                                        m[y, x]  = (float)(valve * 0.2);
                                    }
                                }
                                float tan;
                                if (Sx != 0)
                                {
                                    tan = Sy / Sx;
                                }
                                else tan = 10000;
                                if (-0.41421356 <= tan && tan < 0.41421356)//角度为-22.5度到22.5度之间
                                {
                                    dlta[y, x] = 0; //	m[y,x] =valve;                                 
                                }
                                else if (0.41421356 <= tan && tan < 2.41421356)//角度为22.5度到67.5度之间
                                {
                                    dlta[y, x] = 1; //m[y,x] = 0;
                                }
                                else if (tan >= 2.41421356 || tan < -2.41421356)//角度为67.5度到90度之间或-90度到-67.5度
                                {
                                    dlta[y, x] = 2;    //	m[y,x] =valve;
                                }
                                else
                                {
                                    dlta[y, x] = 3;//m[y,x] = 0;     
                                }
                            }
                            else
                                m[y, x] = 0;
                            p  = 3;
                            if (m[y, x] > 0)
                            {
                                sumCount  ;
                                sumM  = m[y, x];
                            }
                        }
                        p  = nOffset;

                    }
                    p = (byte*)(void*)Scan0; //非极大值抑制和阀值
                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            if (m[y, x] > sumM / sumCount * 1.2)
                            {
                                p[0] = p[1] = p[2] = (byte)(m[y, x]); //m[y,x]=1;                            
                            }
                            else
                            {
                                m[y, x] = 0;
                                p[0] = p[1] = p[2] = 0;
                            }
                            if (x >= 1 && x <= nWidth - 1 && y >= 1 && y <= nHeight - 1 && m[y, x] > valve)
                            {
                                switch (dlta[y, x])
                                {
                                    case 0:
                                        if (m[y, x] >= m[y, x - 1] && m[y, x] >= m[y, x   1])//水平边缘
                                        {
                                            p[0] = p[1] = p[2] = 255;
                                        }
                                        break;

                                    case 1:
                                        if (m[y, x] >= m[y   1, x - 1] && m[y, x] >= m[y - 1, x   1])//正斜45度边缘
                                        {
                                            p[0] = p[1] = p[2] = 255;
                                        }
                                        break;

                                    case 2:
                                        if (m[y, x] >= m[y - 1, x] && m[y, x] >= m[y   1, x])//垂直边缘
                                        {
                                            p[0] = p[1] = p[2] = 255;
                                        }
                                        break;

                                    case 3:
                                        if (m[y, x] >= m[y   1, x   1] && m[y, x] >= m[y - 1, x - 1])//反斜45度边缘
                                        {
                                            p[0] = p[1] = p[2] = 255;
                                        }
                                        break;
                                }
                            }
                            if (p[0] == 255)
                            {
                                m[y, x] = 1;
                            }
                            else
                            {
                                m[y, x] = 0;
                                p[0] = p[1] = p[2] = 0;
                            }

                            tt = p[0];
                            gray[tt]  ;
                            p  = 3;
                        }
                        //  p  = nOffset;
                    }
                    m_Bitmap.UnlockBits(bmData);
                    flag = 1;
                    graydo();
                }
            }
        }
        private void 车牌定位()
        {
           // always_Bitmap = (Bitmap)Bitmap.FromFile(name, false);
            this.c_Bitmap = Recoginzation.licensePlateLocation(m_Bitmap, always_Bitmap, m);
            extract_Bitmap_one = c_Bitmap.Clone(new Rectangle(0, 0, c_Bitmap.Width, c_Bitmap.Height), PixelFormat.DontCare);
            this.panel1.Invalidate();
            this.LocatedPanel.Invalidate();
            this.ExtractPanel.Invalidate();
        }
        //车牌处理事件
        private void c灰度化()
        {
            if (c_Bitmap != null)
            {
                int tt = 0;
                for (int i = 0; i < 256; i  )//清掉数组gray里的数据
                {
                    gray[i] = 0;
                }
                for (int i = 0; i < 256; i  )//清掉数组rr里的数据
                {
                    rr[i] = 0;
                }
                for (int i = 0; i < 256; i  )//清掉数组gg里的数据
                {
                    gg[i] = 0;
                }
                for (int i = 0; i < 256; i  )//清掉数组bb里的数据
                {
                    bb[i] = 0;
                }
                BitmapData bmData = c_Bitmap.LockBits(new Rectangle(0, 0, c_Bitmap.Width, c_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                int stride = bmData.Stride;//获取或设置 Bitmap 对象的跨距宽度(也称为扫描宽度)。 
                System.IntPtr Scan0 = bmData.Scan0;//获取或设置位图中第一个像素数据的地址。 它也可以看成是位图中的第一个扫描行
                unsafe
                {
                    byte* p = (byte*)(void*)Scan0;
                    int nOffset = stride - c_Bitmap.Width * 3;
                    byte red, green, blue;
                    int nWidth = c_Bitmap.Width;
                    int nHeight = c_Bitmap.Height;
                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            blue = p[0];
                            green = p[1];
                            red = p[2];
                            tt = p[0] = p[1] = p[2] = (byte)(.299 * red   .587 * green   .114 * blue);
                            rr[red]  ;
                            gg[green]  ;
                            bb[blue]  ;
                            gray[tt]  ;   //统计灰度值为tt的象素点数目  
                            p  = 3;
                        }
                        p  = nOffset;
                    }
                }
                c_Bitmap.UnlockBits(bmData);
                flag = 2;
                this.LocatedPanel.Invalidate();
                panel1.Invalidate();
                graydo();
            }

        }
        private void c二值化()
        {
            if (c_Bitmap != null)
            {
                int Mr = 0;//灰度均值
                long sum = 0;
                int count = 0;
                for (int i = 0; i < 256; i  )//像素个数与灰度等级的乘积除以像素个数
                {
                    sum  = gray[i] * i;
                    count  = gray[i];
                }
                Mr = (int)(sum / count);
                int sum1 = 0;
                int count1 = 0;
                for (int i = 0; i <= Mr; i  )
                {
                    sum1  = gray[i] * i;
                    count1  = gray[i];
                }
                int g1 = sum1 / count1;

                int sum2 = 0;
                int count2 = 0;
                for (int i = Mr; i <= 255; i  )
                {
                    sum2  = gray[i] * i;
                    count2  = gray[i];
                }
                int g2 = sum2 / count2;

                //求阀值
                int va;
                if (count1 < count2)
                {//白底黑字
                    va = Mr - count1 / count2 * Math.Abs(g1 - Mr);
                }
                else                //黑底白字
                    va = Mr   count2 / count1 * Math.Abs(g2 - Mr);
                BitmapData bmData = c_Bitmap.LockBits(new Rectangle(0, 0, c_Bitmap.Width, c_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                unsafe
                {
                    int stride = bmData.Stride;
                    System.IntPtr Scan0 = bmData.Scan0;
                    byte* p = (byte*)(void*)Scan0;
                    int nOffset = stride - c_Bitmap.Width * 3;

                    int nWidth = c_Bitmap.Width;
                    int nHeight = c_Bitmap.Height;


                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            if (p[0] > va)
                            {
                                p[0] = p[1] = p[2] = 255;
                            }
                            else
                                p[0] = p[1] = p[2] = 0;

                            p  = 3;
                        }
                        p  = nOffset;

                    }

                }
                c_Bitmap.UnlockBits(bmData);
                LocatedPanel.Invalidate();
            }
        }
        /*******************************************************************************/
        /***********************************其他的一些事件***********************************/
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (m_Bitmap != null)
            {
                
                Graphics g = e.Graphics;
                if (m_Bitmap.Width < panel1.Width && m_Bitmap.Height < panel1.Height)
                {
                    g.DrawImage(m_Bitmap, new Rectangle((this.panel1.Width-m_Bitmap.Width)/2, (this.panel1.Height-m_Bitmap.Height)/2, (int)(m_Bitmap.Width), (int)(m_Bitmap.Height)));
                }
                else
                {
                    g.DrawImage(m_Bitmap, new Rectangle(this.panel1.AutoScrollPosition.X, this.panel1.AutoScrollPosition.Y, (int)(m_Bitmap.Width), (int)(m_Bitmap.Height)));
                }
            }
        }
        private void 文件_打开()
        {
            this.clearAllPanel();
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Jpeg文件(*.jpg)|*.jpg|Bitmap文件(*.bmp)|*.bmp| 所有合适文件(*.bmp/*.jpg)|*.bmp/*.jpg";
            openFileDialog.FilterIndex = 2;
            openFileDialog.RestoreDirectory = true;//该值指示对话框在关闭前是否还原当前目录
            if (DialogResult.OK == openFileDialog.ShowDialog())
            {
                name = openFileDialog.FileName;
                m_Bitmap = (Bitmap)Bitmap.FromFile(name, false);//使用该文件中的嵌入颜色管理信息,从指定的文件创建m_Bitmap
                this.always_Bitmap = m_Bitmap.Clone(new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height), PixelFormat.DontCare);
                this.panel1.AutoScroll = true;
                this.panel1.AutoScrollMinSize = new Size((int)(m_Bitmap.Width), (int)m_Bitmap.Height);
                this.label1.Text = name;
                panel1.Invalidate();//使panel1内的图像重新绘制


            }
        }
        private void graydo()//灰度直方图的调用
        {
            // this.flag = 1;
            switch (flag)
            {
                case 1:
                    {
                        count = m_Bitmap.Width * m_Bitmap.Height;
                        gl = new float[256];
                        for (int i = 0; i < 256; i  )
                            gl[i] = gray[i] / count * 8000;//灰度直方图计算公式
                        pen1 = Pens.Red;
                        panel1.Invalidate();
                        GraphyPanel.Invalidate();//使GraphyPanel内的图像重新绘制
                        break;
                    }

                case 2:
                    {
                        count = c_Bitmap.Width * c_Bitmap.Height;
                        gl = new float[256];
                        for (int i = 0; i < 256; i  )
                            gl[i] = gray[i] / count * 5000;//灰度直方图计算公式
                        pen1 = Pens.Gray;
                        panel1.Invalidate();
                        GraphyPanel.Invalidate();//使GraphyPanel内的图像重新绘制
                        break;
                    }
                default:
                    break;

            }
        }
        private void Accuracy()
        {
            if (c_Bitmap != null)
            {
                flag1 = 1;
                BitmapData bmData = c_Bitmap.LockBits(new Rectangle(0, 0, c_Bitmap.Width, c_Bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                //现在的c_Bitmap是车牌图片
                unsafe
                {
                    int stride = bmData.Stride;
                    System.IntPtr Scan0 = bmData.Scan0;
                    byte* p = (byte*)(void*)Scan0;
                    int nOffset = stride - c_Bitmap.Width * 3;

                    int nWidth = c_Bitmap.Width;
                    int nHeight = c_Bitmap.Height;
                    int[] countHeight = new int[nHeight];
                    int[] countWidth = new int[nWidth];
                    int Yheight = nHeight, YBottom = 0;
                    for (int i = 0; i < nHeight; i  )
                    {
                        countHeight[i] = 0;
                    }
                    for (int y = 0; y < nHeight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            if ((p[0] == 0 && p[3] == 255) || (p[0] == 255 && p[3] == 0))
                            {
                                countHeight[y]  ;
                            }


                            p  = 3;
                        }
                        Console.WriteLine(y   "*******************跳变数     "   countHeight[y]);
                        p  = nOffset;

                    }
                    
                    //计算车牌号的上边缘
                    for (int y = nHeight / 2; y > 0; y--)
                    {
                        if (countHeight[y] >= 16 && countHeight[(y   1) % nHeight] >= 12)//12,6,11
                        {
                            if (Yheight > y)
                            {
                                Yheight = y;
                                //YBottom = y;
                            }//此if语句只执行了好多次
                            if ((Yheight - y) == 1)
                            { Yheight = y - 3; Console.WriteLine("------------"   Yheight); }
                        }
                        //Console.WriteLine("现在图片的顶部是:"   Yheight);

                    }
                    //计算车牌号的下边缘
                    for (int y = nHeight / 2; y < nHeight; y  )
                    {
                        if (countHeight[y] >= 12 && countHeight[(y   1) % nHeight] >= 12)//12,6,11
                        {
                            if (YBottom < y)
                            {
                                YBottom = y;
                                //YBottom = y;
                            }//此if语句只执行了一次
                            if ((y - YBottom) == 1)
                            { YBottom = y   3; Console.WriteLine("------------"   YBottom); }
                        }
                       // Console.WriteLine("NOW图片的底部是:"   YBottom);

                    }
                    YBottom  = 1;//主要目的是由于计算时少算了1
                    byte* p1 = (byte*)(void*)Scan0;
                    p1  = stride * (Yheight - 1);
                    for (int y = Yheight; y < YBottom;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {

                            if (p1[0] == 255)
                                countWidth[x]  ;

                            p1  = 3;
                        }
                        p1  = nOffset;
                    }
                    int contg = 0, contd = 0, countRightEdge = 0, countLeftEdge = 0, Yl = nWidth, Yr = 0;
                    int[] XLeft = new int[20];
                    int[] XRight = new int[20];
                    foreach (int i in XRight)
                    {
                        XRight[i] = 0;
                    }
                    foreach (int i in XLeft)
                    {
                        XLeft[i] = 0;
                    }
                    for (int y = 1; y < YBottom - Yheight;   y)
                    {
                        for (int x = 0; x < nWidth;   x)
                        {
                            if (countWidth[(x   1) % nWidth] < y && countWidth[x] >= y && countWidth[Math.Abs((x - 1) % nWidth)] >= y && contg >= 2)
                            {
                                //if (countWidth[(x   1)] < y && countWidth[x] >= y && countWidth[Math.Abs((x - 1) )] >= y && contg >= 2)
                                //{
                                if (countRightEdge == 6)
                                { Yr = x; }
                                if ((countRightEdge == 2 && (x >= XLeft[2] && XLeft[2] > 0)))
                                {
                                    XRight[countRightEdge] = x;
                                    countRightEdge  ;
                                    contd = 0;
                                }
                                else
                                {
                                    if ((countRightEdge != 2))
                                    {
                                        if (countRightEdge == 0 && contg < 4)
                                        {
                                            XLeft[0] = 0;
                                            countLeftEdge = 0;
                                        }
                                        if ((x >= XLeft[0] && XLeft[0] > 0))
                                        {
                                            XRight[countRightEdge] = x;
                                            countRightEdge  ;
                                            contd = 0;
                                        }
                                    }
                                }
                            }
                            if (countWidth[Math.Abs((x - 1) % nWidth)] < y && countWidth[x] >= y && countWidth[(x   1) % nWidth] >= y && contd >= 2)
                            {
                                if (countLeftEdge == 0 && countWidth[(x   2) % nWidth] >= y)
                                { Yl = x; }
                                if ((countLeftEdge == 2 && contd > 5))
                                {
                                    XLeft[countLeftEdge] = x;
                                    countLeftEdge  ;

                                }
                                else
                                {
                                    if ((countLeftEdge != 2))
                                    {
                                        XLeft[countLeftEdge] = x;
                                        countLeftEdge  ;
                                        contg = 0;
                                        if (countLeftEdge == 0 && countWidth[(x   2) % nWidth] < y)
                                        {
                                            XLeft[0] = 0;
                                            countLeftEdge = 0;
                                        }

                                    }
                                }
                            }
                            contg  ;
                            contd  ;

                        }
                        if (countRightEdge   countLeftEdge >= 14)
                        {
                            break;
                        }
                        countRightEdge = 0;
                        countLeftEdge = 0;
                        for (int i = 0; i < XRight.Length; i  )
                        {
                            XRight[i] = 0;
                        }
                        for (int i = 0; i < XLeft.Length; i  )
                        {
                            XLeft[i] = 0;
                        }
                    }
                    c_Bitmap.UnlockBits(bmData);
                    if ((YBottom - Yheight) > 1 && (Yr - Yl) > 1)
                    {
                        Rectangle sourceRectangle = new Rectangle(Yl, Yheight, Yr - Yl, YBottom - Yheight);
                        //c_Bitmap2是画线的那个图片
                        extract_Bitmap_two = extract_Bitmap_one.Clone(sourceRectangle, PixelFormat.DontCare);
                        BitmapData bmData2 = extract_Bitmap_two.LockBits(new Rectangle(0, 0, extract_Bitmap_two.Width, extract_Bitmap_two.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                        int stride2 = bmData2.Stride;
                        System.IntPtr Scan02 = bmData2.Scan0;
                        byte* p2 = (byte*)(void*)Scan02;
                        int nOffset2 = stride2 - extract_Bitmap_two.Width * 3;

                        int nWidth2 = extract_Bitmap_two.Width;
                        int nHeight2 = extract_Bitmap_two.Height;
                        for (int y = 0; y < nHeight2;   y)
                        {
                            for (int x = 0; x < nWidth2;   x)
                            {

                                if (x == (XRight[0] - Yl) || x == (XLeft[0] - Yl) || x == (XRight[1] - Yl) || x == (XLeft[1] - Yl) || x == (XRight[2] - Yl) || x == (XLeft[2] - Yl) || x == (XRight[3] - Yl) || x == (XLeft[3] - Yl) || x == (XRight[4] - Yl) || x == (XLeft[4] - Yl) || x == (XRight[5] - Yl) || x == (XLeft[5] - Yl) || x == (XRight[6] - Yl) || x == (XLeft[6] - Yl) || x == (XRight[7] - Yl) || x == (XLeft[7] - Yl))
                                {
                                    if (x != 0)
                                    {
                                        p2[2] = 255; p2[0] = p2[1] = 0;
                                    }
                                }

                                p2  = 3;
                            }
                            p2  = nOffset2;

                        }
                        extract_Bitmap_two.UnlockBits(bmData2);
                        this.ExtractPanel.Invalidate();
                        if ((YBottom - Yheight) > 1 && (XRight[1] - XLeft[1]) > 1)
                        {

                            Rectangle sourceRectangle2 = new Rectangle(XLeft[1], Yheight, XRight[1] - XLeft[1], YBottom - Yheight);
                            z_Bitmap1 = extract_Bitmap_one.Clone(sourceRectangle2, PixelFormat.DontCare);
                            z_Bitmaptwo[1] = c_Bitmap.Clone(sourceRectangle2, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[1], 9, 16);
                            z_Bitmaptwo[1] = objNewPic;
                            objNewPic.Save("d:\\1.bmp");
                            objNewPic = null;
                            FontPanel2.Invalidate();
                        }
                        if ((YBottom - Yheight) > 1 && (XRight[2] - XLeft[2]) > 1)
                        {

                            Rectangle sourceRectangle3 = new Rectangle(XLeft[2], Yheight, XRight[2] - XLeft[2], YBottom - Yheight);
                            z_Bitmap2 = extract_Bitmap_one.Clone(sourceRectangle3, PixelFormat.DontCare);
                            z_Bitmaptwo[2] = c_Bitmap.Clone(sourceRectangle3, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[2], 9, 16);
                            z_Bitmaptwo[2] = objNewPic;
                            objNewPic.Save("d:\\2.bmp");
                            objNewPic = null;
                            FontPanel3.Invalidate();
                        }
                        if ((YBottom - Yheight) > 1 && (XRight[3] - XLeft[3]) > 1)
                        {
                            Rectangle sourceRectangle4 = new Rectangle(XLeft[3], Yheight, XRight[3] - XLeft[3], YBottom - Yheight);
                            z_Bitmap3 = extract_Bitmap_one.Clone(sourceRectangle4, PixelFormat.DontCare);
                            z_Bitmaptwo[3] = c_Bitmap.Clone(sourceRectangle4, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[3], 9, 16);
                            z_Bitmaptwo[3] = objNewPic;
                            objNewPic.Save("d:\\3.bmp");
                            objNewPic = null;
                            FontPanel4.Invalidate();
                        }
                        if ((YBottom - Yheight) > 1 && (XRight[4] - XLeft[4]) > 1)
                        {
                            Rectangle sourceRectangle5 = new Rectangle(XLeft[4], Yheight, XRight[4] - XLeft[4], YBottom - Yheight);
                            z_Bitmap4 = extract_Bitmap_one.Clone(sourceRectangle5, PixelFormat.DontCare);
                            z_Bitmaptwo[4] = c_Bitmap.Clone(sourceRectangle5, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[4], 9, 16);
                            z_Bitmaptwo[4] = objNewPic;
                            objNewPic.Save("d:\\4.bmp");
                            objNewPic = null;
                            FontPanel5.Invalidate();
                            // z_Bitmap4.Dispose();
                        }
                        if ((YBottom - Yheight) > 1 && (XRight[5] - XLeft[5]) > 1)
                        {
                            Rectangle sourceRectangle6 = new Rectangle(XLeft[5], Yheight, XRight[5] - XLeft[5], YBottom - Yheight);
                            z_Bitmap5 = extract_Bitmap_one.Clone(sourceRectangle6, PixelFormat.DontCare);
                            z_Bitmaptwo[5] = c_Bitmap.Clone(sourceRectangle6, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[5], 9, 16);
                            z_Bitmaptwo[5] = objNewPic;
                            objNewPic.Save("d:\\5.bmp");
                            objNewPic = null;
                            FontPanel6.Invalidate();
                            // z_Bitmap5.Dispose();
                        }
                        if ((YBottom - Yheight) > 1 && (XRight[6] - XLeft[6]) > 1)
                        {

                            Rectangle sourceRectangle7 = new Rectangle(XLeft[6], Yheight, XRight[6] - XLeft[6], YBottom - Yheight);
                            z_Bitmap6 = extract_Bitmap_one.Clone(sourceRectangle7, PixelFormat.DontCare);
                            z_Bitmaptwo[6] = c_Bitmap.Clone(sourceRectangle7, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[6], 9, 16);
                            z_Bitmaptwo[6] = objNewPic;
                            objNewPic.Save("d:\\6.bmp");
                            objNewPic = null;
                            FontPanel7.Invalidate();
                            //z_Bitmap6.Dispose();
                        }
                        if ((YBottom - Yheight) > 1 && (XRight[0] - XLeft[0]) > 1)
                        {

                            Rectangle sourceRectangle0 = new Rectangle(XLeft[0], Yheight, XRight[0] - XLeft[0], YBottom - Yheight);
                            z_Bitmap0 = extract_Bitmap_one.Clone(sourceRectangle0, PixelFormat.DontCare);
                            z_Bitmaptwo[0] = c_Bitmap.Clone(sourceRectangle0, PixelFormat.DontCare);
                            objNewPic = new System.Drawing.Bitmap(z_Bitmaptwo[0], 9, 16);
                            z_Bitmaptwo[0] = objNewPic;
                            objNewPic.Save("d:\\0.bmp");
                            objNewPic = null;
                            FontPanel1.Invalidate();
                        }
                        
                    }

                }
            }
        }
        private void clearAllPanel()
        {
            this.c_Bitmap = null;
            this.extract_Bitmap_two = null;
            this.z_Bitmap0 = null;
            this.z_Bitmap1 = null;
            this.z_Bitmap2 = null;
            this.z_Bitmap3 = null;
            this.z_Bitmap4 = null;
            this.z_Bitmap5 = null;
            this.z_Bitmap6 = null;
            this.ResultLabel.Text = "";
            this.label1.Text = "";
            this.GraphyPanel.Invalidate();
            this.LocatedPanel.Invalidate();
            this.ExtractPanel.Invalidate();
            this.FontPanel1.Invalidate();
            this.FontPanel2.Invalidate();
            this.FontPanel3.Invalidate();
            this.FontPanel4.Invalidate();
            this.FontPanel5.Invalidate();
            this.FontPanel6.Invalidate();
            this.FontPanel7.Invalidate();
        }
        private void GraphyPanel_Paint(object sender, PaintEventArgs e)
        {
            if (m_Bitmap != null)
            {
                Graphics g = e.Graphics;
                //int p;
                //p = m_Bitmap.Width * m_Bitmap.Height;
                int height = this.GraphyPanel.Height;
                g.DrawString("0", new Font("New Timer", 8), Brushes.Black, new PointF(0, height - 15));
                g.DrawString("50", new Font("New Timer", 8), Brushes.Black, new PointF(50, height - 15));
                g.DrawString("100", new Font("New Timer", 8), Brushes.Black, new PointF(100, height - 15));
                g.DrawString("150", new Font("New Timer", 8), Brushes.Black, new PointF(150, height - 15));
                g.DrawString("200", new Font("New Timer", 8), Brushes.Black, new PointF(200, height - 15));
                g.DrawString("250", new Font("New Timer", 8), Brushes.Black, new PointF(245, height - 15));//给直方图划定大概坐标
                for (int j = 0; j < 256; j  )
                {
                    if (gl[j] > height)
                        gl[j] = height;
                    g.DrawLine(pen1, j, height - 20, j, height - gl[j] - 20);//绘制直方图
                }
                /* if (aline)
                 {
                     g.DrawLine(Pens.OrangeRed, xx, 0, xx, height);
                 }*/
            }
            else
            {
                Graphics g = this.GraphyPanel.CreateGraphics();
                g.Clear(this.GraphyPanel.BackColor);
               
            }
        }

        private void LocatedPanel_Paint(object sender, PaintEventArgs e)
        {
            if (c_Bitmap != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(c_Bitmap, 0, 0, this.LocatedPanel.Width, LocatedPanel.Height);
            }
            else
            {
                Graphics g = this.LocatedPanel.CreateGraphics();
                g.Clear(this.LocatedPanel.BackColor);
            }
            //else
            //{
            //    Graphics g = e.Graphics;
            //    g.DrawRectangle(new Pen(Color.Violet), 0, 0, LocatedPanel.Width, LocatedPanel.Height);
            //}
        }

        private void ExtractPanel_Paint(object sender, PaintEventArgs e)
        {
            if (extract_Bitmap_two != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(extract_Bitmap_two, 0, 0, this.ExtractPanel.Width, ExtractPanel.Height);
            }
            else
            {
                Graphics g = this.ExtractPanel.CreateGraphics();
                g.Clear(this.ExtractPanel.BackColor);
            }
        }

        private void FontPanel1_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap0 != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(z_Bitmap0, 0, 0, FontPanel1.Width, FontPanel1.Height);
            }
            else
            {
                Graphics g = this.FontPanel1.CreateGraphics();
                g.Clear(this.FontPanel1.BackColor);
            }
        }

        private void FontPanel2_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap1 != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(z_Bitmap1, 0, 0, FontPanel2.Width, FontPanel2.Height);
            }
            else
            {
                Graphics g = this.FontPanel2.CreateGraphics();
                g.Clear(this.FontPanel2.BackColor);
            }
        }

        private void FontPanel3_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap2 != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(z_Bitmap2, 0, 0, FontPanel3.Width, FontPanel3.Height);
            }
            else
            {
                Graphics g = this.FontPanel3.CreateGraphics();
                g.Clear(this.FontPanel3.BackColor);
            }
        }

        private void FontPanel4_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap3 != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(z_Bitmap3, 0, 0, FontPanel4.Width, FontPanel4.Height);
            }
            else
            {
                Graphics g = this.FontPanel4.CreateGraphics();
                g.Clear(this.FontPanel4.BackColor);
            }
        }

        private void FontPanel5_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap4 != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(z_Bitmap4, 0, 0, FontPanel5.Width, FontPanel5.Height);
            }
            else
            {
                Graphics g = this.FontPanel5.CreateGraphics();
                g.Clear(this.FontPanel5.BackColor);
            }
        }

        private void FontPanel6_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap5 != null)
            {
                Graphics g = e.Graphics;
                //PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
                g.DrawImage(z_Bitmap5, 0, 0, FontPanel6.Width, FontPanel6.Height);
            }
            else
            {
                Graphics g = this.FontPanel6.CreateGraphics();
                g.Clear(this.FontPanel6.BackColor);
            }
        }

        private void FontPanel7_Paint(object sender, PaintEventArgs e)
        {
            if (z_Bitmap6 != null)
            {
                Graphics g = e.Graphics;
                g.DrawImage(z_Bitmap6, 0, 0, FontPanel7.Width, FontPanel7.Height);

            }
            else
            {
                Graphics g = this.FontPanel7.CreateGraphics();
                g.Clear(this.FontPanel7.BackColor);
            }
        }
        public int TransformFiles(string path)
        {
            DirectoryInfo dir = new DirectoryInfo(path);
            //DirectoryInfo[] dirs = dir.GetDirectories();
            FileInfo[] files = dir.GetFiles("*.bmp");

            int i = 0, j = 0;
            try
            {

                foreach (FileInfo f in files)
                {

                    this.listBox1.Items.Add(dir   f.ToString());
                    i  ;
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
            if (path.Equals(charSourceBath))
            {
                this.charString = new string[i];
                this.charDigitalString = new string[i];
                try
                {

                    foreach (FileInfo f in files)
                    {


                        charString[j] = (dir   f.ToString());
                        charDigitalString[j] = Path.GetFileNameWithoutExtension(charString[j]);
                        //Console.WriteLine(charDigitalString[j]);
                        j  ;

                    }
                    //Console.WriteLine(j);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
            else
            {
                provinceString = new string[i];
                provinceDigitalString = new string[i];

                try
                {

                    foreach (FileInfo f in files)
                    {


                        provinceString[j] = (dir   f.ToString());
                        provinceDigitalString[j] = Path.GetFileNameWithoutExtension(provinceString[j]);
                        //Console.WriteLine(provinceString[j]);

                        j  ;

                    }
                   // Console.WriteLine(j);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }

            return i;
        }
        private int minNumber(int[] num)//计算数组中的最小值索引
        {
            int minIndex = 0;
            int minNum = 1000;
            for (int i = 0; i < num.Length; i  )
            {
                if (minNum > num[i])
                {
                    minNum = num[i];
                    minIndex = i;
                }
            }
            return minIndex;
        }
        private void MaptoCharReg()
        {
            int charBmpCount = this.TransformFiles(charSourceBath);
            int provinceBmpCount = this.TransformFiles(provinceSourceBath);
            int[] charMatch = new int[charBmpCount];//存储当前图片和资源库中图片比对后所得的像素不同的个数
            int[] provinceMatch = new int[provinceBmpCount];

            charFont = new Bitmap[charBmpCount];
            provinceFont = new Bitmap[provinceBmpCount];//这两个数组存储的是资源库中的bitmap文件
            //Console.WriteLine("一共有这么几个资源文件"   (charBmpCount   provinceBmpCount));
            for (int i = 0; i < charBmpCount; i  )
            {
                charMatch[i] = 0;
            }
            for (int i = 0; i < provinceBmpCount; i  )
            {
                provinceMatch[i] = 0;
            }
            for (int i = 0; i < charBmpCount; i  )
            {
                charFont[i] = (Bitmap)Bitmap.FromFile(charString[i], false);//使用该文件中的嵌入颜色管理信息,从指定的文件创建m_Bitmap
            }                                                               //charString存储的是路径
            for (int i = 0; i < provinceBmpCount; i  )
            {
                provinceFont[i] = (Bitmap)Bitmap.FromFile(provinceString[i], false);//使用该文件中的嵌入颜色管理信息,从指定的文件创建m_Bitmap
            }

            int matchIndex = 0;//最终匹配索引
            string[] digitalFont = new string[7];
            unsafe
            {
                if (z_Bitmaptwo[0] != null)
                {
                    BitmapData bmData = z_Bitmaptwo[0].LockBits(new Rectangle(0, 0, z_Bitmaptwo[0].Width, z_Bitmaptwo[0].Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                    int stride = bmData.Stride;
                    System.IntPtr Scan = bmData.Scan0;
                    // byte* p = (byte*)(void*)Scan;
                    int nOffset = stride - z_Bitmaptwo[0].Width * 3;
                    int nWidth = z_Bitmaptwo[0].Width;
                    int nHeight = z_Bitmaptwo[0].Height;
                    int lv, lc = 30;

                    for (int i = 0; i < provinceBmpCount; i  )
                    {
                        byte* p = (byte*)(void*)Scan;
                        BitmapData bmData1 = provinceFont[i].LockBits(new Rectangle(0, 0, provinceFont[i].Width, provinceFont[i].Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                        int stride1 = bmData1.Stride;
                        System.IntPtr Scan1 = bmData1.Scan0;
                        byte* p1 = (byte*)(void*)Scan1;
                        int nOffset1 = stride1 - provinceFont[i].Width * 3;
                        int nWidth1 = provinceFont[i].Width;
                        int nHeight1 = provinceFont[i].Height;
                        int ccc0 = 0, ccc1 = 0;
                        lv = 0;//两个图片匹配不相同的地方
                        for (int y = 0; y < nHeight;   y)
                        {
                            for (int x = 0; x < nWidth;   x)
                            {

                                if ((p[0] - p1[0]) != 0)
                                {
                                    provinceMatch[i]  ;
                                    //Console.WriteLine(ccc0  );
                                }

                                //if (p[0] == 255)
                                //{ ccc0  ; }
                                //if (p[1] == 255)
                                //{ ccc1  ; }
                                p1  = 3;
                                p  = 3;

                            }
                            p1  = nOffset;
                            p  = nOffset;
                        }
                        //Console.WriteLine(provinceDigitalString[i]   "不相同的像素数值"   provinceMatch[i]);
                        //lv = lv   Math.Abs(ccc0 - ccc1);
                        matchIndex = this.minNumber(provinceMatch);
                        digitalFont[0] = provinceDigitalString[matchIndex].Substring(0,1);//文件的名字和图片信息匹配,所以得到的文件名就是图片上的文字

                        provinceFont[i].UnlockBits(bmData1);

                    }
                    z_Bitmaptwo[0].UnlockBits(bmData);
                }



                if (z_Bitmaptwo[1] != null && z_Bitmaptwo[2] != null && z_Bitmaptwo[3] != null && z_Bitmaptwo[4] != null && z_Bitmaptwo[5] != null && z_Bitmaptwo[6] != null)
                {
                    for (int j = 1; j < 7; j  )
                    {
                        BitmapData bmData = z_Bitmaptwo[j].LockBits(new Rectangle(0, 0, z_Bitmaptwo[j].Width, z_Bitmaptwo[j].Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                        int stride = bmData.Stride;
                        System.IntPtr Scan = bmData.Scan0;
                        // byte* p = (byte*)(void*)Scan;
                        int nOffset = stride - z_Bitmaptwo[j].Width * 3;
                        int nWidth = z_Bitmaptwo[j].Width;
                        int nHeight = z_Bitmaptwo[j].Height;
                        int lv, lc = 0;
                        //Console.WriteLine("======================================"   j);
                        for (int i = 0; i < charBmpCount; i  )
                        {
                            charMatch[i] = 0;
                        }
                        for (int i = 0; i < charBmpCount; i  )
                        {
                            byte* p = (byte*)(void*)Scan;
                            BitmapData bmData1 = charFont[i].LockBits(new Rectangle(0, 0, charFont[i].Width, charFont[i].Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                            int stride1 = bmData1.Stride;
                            System.IntPtr Scan1 = bmData1.Scan0;
                            byte* p1 = (byte*)(void*)Scan1;
                            int nOffset1 = stride1 - charFont[i].Width * 3;
                            int nWidth1 = charFont[i].Width;
                            int nHeight1 = charFont[i].Height;
                            int ccc0 = 0, ccc1 = 0;
                            lv = 0;
                            for (int y = 0; y < nHeight;   y)
                            {
                                for (int x = 0; x < nWidth;   x)
                                {

                                    if ((p[0] - p1[0]) != 0)
                                    {
                                        charMatch[i]  ;
                                        // Console.WriteLine(ccc0  );
                                    }
                                    lv  ;
                                    p1  = 3;
                                    p  = 3;
                                }
                                p1  = nOffset;
                                p  = nOffset;
                            }
                           // Console.WriteLine("图像尺寸"   lv);
                            Console.WriteLine(charDigitalString[i]   "数字中不相同的像素数值"   charMatch[i]);
                            matchIndex = this.minNumber(charMatch);
                            digitalFont[j] = charDigitalString[matchIndex].Substring(0, 1);//截取文件名的第一个字符就行了

                            charFont[i].UnlockBits(bmData1);

                        }

                        z_Bitmaptwo[j].UnlockBits(bmData);
                    }
                }






            }


            this.ResultLabel.Text = ""   digitalFont[0]   digitalFont[1]   digitalFont[2]   digitalFont[3]   digitalFont[4]   digitalFont[5]   digitalFont[6];
        }

        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {

        }

        private void 皮肤一ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.skinEngine1.SkinFile = "EmeraldColor1.ssk";
        }

        private void 皮肤二ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.skinEngine1.SkinFile = "EighteenColor2.ssk";
        }

        private void 皮肤三ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.skinEngine1.SkinFile = "GlassOrange.ssk";
        }

        private void 皮肤四ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.skinEngine1.SkinFile = "SteelBlack.ssk";
        }

        private void 皮肤五ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.skinEngine1.SkinFile = "Page.ssk";
        }
        private void 皮肤六ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.skinEngine1.SkinFile = "OneBlue.ssk";
        }
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            this.文件_打开();
        }

        private void FontPanel1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag=provinceSourceBath;
            singleBitmap = z_Bitmaptwo[0];
            SinglePanel.Invalidate();
        }

        private void FontPanel2_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag = charSourceBath;
            singleBitmap = z_Bitmaptwo[1];
            SinglePanel.Invalidate();
        }

        private void FontPanel3_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag = charSourceBath;
            singleBitmap = z_Bitmaptwo[2];
            SinglePanel.Invalidate();
        }

        private void FontPanel4_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag = charSourceBath;
            singleBitmap = z_Bitmaptwo[3];
            SinglePanel.Invalidate();
        }

        private void FontPanel5_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag = charSourceBath;
            singleBitmap = z_Bitmaptwo[4];
            SinglePanel.Invalidate();
        }

        private void FontPanel6_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag = charSourceBath;
            singleBitmap = z_Bitmaptwo[5];
            SinglePanel.Invalidate();
        }

        private void FontPanel7_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.bathFlag = charSourceBath;
            singleBitmap = z_Bitmaptwo[6];
            SinglePanel.Invalidate();
        }
        private void SinglePanel_Paint(object sender, PaintEventArgs e)
        {
            if (singleBitmap != null)
            {
                Graphics g = e.Graphics;
                g.DrawImage(singleBitmap, 0, 0, SinglePanel.Width, SinglePanel.Height);
            }
            else
            {
                Graphics g = this.SinglePanel.CreateGraphics();
                g.Clear(this.SinglePanel.BackColor);
            }
        }

        private void SingleButton_Click(object sender, EventArgs e)
        {
            String fontName = this.SingleTextBox.Text;
            String formatName = null;
            formatName = GeneralTools.getFormatName(bathFlag,fontName);
            //Console.WriteLine(formatName   "   "   bathFlag);
            //this.thisBitmap.Save(licensePlateBath   this.textBox1.Text   ".bmp");
            this.singleBitmap.Save(bathFlag   formatName   ".bmp");
        }

       

    }
}


标签: C# c 识别 源代码 代码

实例下载地址

C#车牌识别源代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 hnhx 发表于: 2018-12-01 18:10 02
非常难得的源代码,可以执行使用!!!

支持(0) 盖楼(回复)

第 2 楼 吃好果子 发表于: 2019-12-17 16:30 15
我来说两句...

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有2条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警