Nhận dạng biển số xe
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN NGHÀNH KHOA HỌC MÁY TÍNH BÀI TẬP MÔN: Lý thuyết nhận dạng ĐỀ TÀI: Nhận dạng biển số xe (Ứng dụng mạng noron) Giáo viên hướng dẫn: Nhóm thực hiện : nhóm 10 Thành viên: 1. Đỗ Văn Tú (C) 2.Đặng Ngọc Tuấn 3. Vũ Ngọc Hoàn 4. Lê Văn Diễn Hà nội ngày tháng .năm 2011 1 Mục Lục I.Giới thiệu hệ thống nhận dạng biển số xe . II.Nhận dạng chữ số, chữ cái và ký tự……………………………………… 1.Nạp ảnh đầu vào 2.Nhận dạng ảnh . 2.1.Số hóa ảnh đầu vào . 2.2.Loại bỏ viền đen 2.3.Dò biên xác định vị trí từng ký tự . 2.4.Khoanh vùng tìm chữ cái và chữ số trên ảnh……… 2.5.Đối sánh và trả kết quả nhận dạng 3. Tối ưu hóa điểm ảnh để nhận dạng khi file ảnh không đủ chất lượng…… III.Chương trình . Nhận xét . 2 I. GIỚI THIỆU HỆ THỐNG NHẬN DẠNG BIỂN SỐ XE Giới thiệu Chương trình nhận dạng biển số xe là chương trình dùng để đọc ảnh biển số xe lấy ra các dưới dạng ký tự để lưu trữ hay in ấn. Bởi vì việc lưu trữ hay in ấn nguyên một cái ảnh thì khác hẳn so với lưu trữ hay in ấn một vài ký tự. Chính vì thế mà việc nhận dạng biển số xe là rất cần thiết và cũng khá là quan trọng. Giới thiệu về ảnh biển số xe Ảnh biển số xe máy được dùng trong nhận dạng là một biển số xe thật được chụp bằng máy ảnh hay máy quay . Trong thực tế hiếm khi nào mà máy ảnh hay máy quay lại chỉ chụp có mỗi cái biển số của xe không thôi mà nó sẽ chụp hình của cả cái xe có thể có cả người trong đó nói chung là còn cả cảnh bên ngoài. Nhiệm vụ đầu tiên là phải tách được vùng chỉ chứa biển số ra thôi và chuyển thành một cái ảnh mới đem vào hệ thống nhận dạng này để xử lý. Vậy thì ảnh xử dụng trong hệ thống nhận dạng là ảnh đã được xử lý một lần rồi chứ không phải là tự nhiên mà có. Cơ sở dữ liệu Cơ sở dữ liệu là các ma trận kích thước 10x20 của các số từ 0 đến 9 và các chữ cái in hoa trong bảng chữ cái. Đây là ma trận chỉ chứa các số 0 và 1. 3 4 Ví dụ ma trận của số 0 như sau: {0,0,1,1,1,1,1,1,0,0}, {0,1,1,1,1,1,1,1,1,0}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,0,0,1,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,0,0,0,0,1,1,1}, {1,1,1,1,0,0,1,1,1,1}, {0,1,1,1,1,1,1,1,1,0}, {0,0,1,1,1,1,1,1,0,0}} Cơ sở dữ liệu này dùng để làm gì? Nó dùng để đối sánh tìm ra các ký tự trong biển số. 5 II. NHẬN DẠNG CHỮ SỐ, CHỮ CÁI VÀ KÝ TỰ 1. Nạp ảnh đầu vào Ta sử dụng công cụ PitureBox trong Visual 2008 để thực hiện nạp ảnh đầu vào. Hàm nạp ảnh đầu vào: private void btnNap_Click(object sender, EventArgs e) { this.Enabled = false; OpenFileDialog OpenFileDialog = new OpenFileDialog(); OpenFileDialog.InitialDirectory = Application.StartupPath + "\\Image"; OpenFileDialog.Filter = "Bitmap files (*.bmp)|*.bmp|Jpeg files (*.jpg)|*.jpg|All valid files|*.*"; OpenFileDialog.FilterIndex = 2; OpenFileDialog.RestoreDirectory = true; if (DialogResult.OK == OpenFileDialog.ShowDialog()) { try { m_Bitmap = (Bitmap)Bitmap.FromFile(OpenFileDialog.FileName, false); this.ptbAnhgoc.Image = new Bitmap(m_Bitmap); this.ptbAnhgoc.SizeMode = PictureBoxSizeMode.StretchImage; m_Undo = new Bitmap(m_Bitmap); this.btnNangCL.Enabled = true; this.grbChacNang.Enabled = false; this.btnNhanDang.Enabled = true; int i = int.Parse(txtMuc1.Text);//mặc định là 100 m_Undo = (Bitmap)m_Bitmap.Clone(); if (ProcessImage.Nguongdon(m_Undo, i)) { this.ptbAnhXuLy.Image = m_Undo; this.ptbAnhXuLy.SizeMode = PictureBoxSizeMode.StretchImage; } } catch (Exception ex) { MessageBox.Show("Can not load image: " + ex.Message); } } //end if 6 this.Enabled = true; } 2. Nhận dạng ảnh 2.1. Số hóa ảnh đầu vào Sau khi phân ngưỡng ảnh đầu vào thành ảnh chỉ với hai màu sáng và tối thì ta sẽ thực hiện bước chuyển ảnh thành ma trận tương ứng các phần tử của ma trận cũng chỉ có hai giá trị là 0 và 1. Ảnh đầu vào có kích cỡ thế nào thì ma trận có kích cỡ như thế. Hàm số hóa ảnh như sau: public static int[,] SoHoaAnh(Bitmap b) { BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int stride = bmData.Stride; System.IntPtr Scan0 = bmData.Scan0; int[,] matrananhgoc = new int[b.Width, b.Height]; unsafe { byte* p = (byte*)(void*)Scan0; int nOffset = stride - b.Width * 3; for (int y = 0; y < b.Height; y++) { for (int x = 0; x < b.Width; x++) { if (p[0] == 0) matrananhgoc[x, y] = 1; else matrananhgoc[x, y] = 0; p += 3; } p += nOffset; } } b.UnlockBits(bmData); return matrananhgoc; } 7 2.2. Loại bỏ viền đen Biển số xe sẽ được nhận dạng trong ảnh lớn nhờ vào khung đen bao quanh biển số chính vì thế mà ta cần loại bỏ khung này ra khỏi ma trận ảnh. Khi đó trong ma trận ảnh sẽ chỉ còn lại nền và ký tự. bool timkhung = true; bool hangtren = true, hangduoi = true, cottrai = true, cotphai = true; while (timkhung) { if (hangtren)//(A_x,A_y)->(B_x,A_y) { hangtren = false; for (int i = A_x; i < B_x+1; i++) if (MaTranAnhGoc[i, A_y] == 1) hangtren = true; if (hangtren) A_y++; } if (hangduoi)//(A_x,B_y)->(B_x,B_y) { hangduoi = false; for (int i = A_x; i < B_x+1; i++) if (MaTranAnhGoc[i, B_y] == 1) hangduoi = true; if (hangduoi) B_y--; } if (cottrai)//(A_x,A_y)->(A_x,B_y) { cottrai = false; for (int i = A_y; i < B_y+1; i++) if (MaTranAnhGoc[A_x, i] == 1) cottrai = true; if (cottrai) A_x++; } if (cotphai)//(B_x,A_y)->(B_x,B_y) { cotphai = false; for (int i = A_y; i < B_y+1; i++) if (MaTranAnhGoc[B_x, i] == 1) cotphai = true; if (cotphai) B_x--; } if (!hangtren && !hangduoi && !cottrai && !cotphai) timkhung = false; } //(A_x,A_y)là tạo độ điểm đầu còn (B_x,B_y) là tọa độ điểm cuối. 8 2.3. Dò biên để xác định vị trí từng ký tự Để xác định được vị trí ký tự trong ma trận ảnh thì ta phải xác định điểm đen cao nhất trong ký tự đó: x = A_x; y = A_y; bool tim_vitrixuatphat = true; while(tim_vitrixuatphat) if(MaTranAnhGoc[x,y]==1) tim_vitrixuatphat=false; else if (x==nuatrai) {x=A_x;y++;} else x++; int[] sovung1 = ProcessImage.DoBien(MaTranAnhGoc,x,y); Sau khi đã tìm được vị trí xuất phát ta đi dò biên để lấy khung hình chữ nhật bao quanh ký tự đó: public static int[] DoBien(int[,] bm, int mx, int my) { int[] ketqua = new int[4]; int Max_x, Min_x, Max_y, Min_y; Min_x = Max_x = mx; Min_y = Max_y = my; bool check1 = true; bool check2 = true; int n = 8;//xác định hướng dò biên. int a; int x = mx; int y = my; while (check1) { check2 = true; 9 while (check2) { switch (n)//định vị vị trí { case 1: a = bm[x + 1, y]; break; case 2: a = bm[x + 1, y + 1]; break; case 3: a = bm[x, y + 1]; break; case 4: a = bm[x - 1, y + 1]; break; case 5: a = bm[x - 1, y]; break; case 6: a = bm[x - 1, y - 1]; break; case 7: a = bm[x, y - 1]; break; default: a = bm[x + 1, y - 1]; break; } if (a == 1) { check2 = false; switch (n) { case 1: x++; n = 8; break; case 2: x++; y++; n = 8; break; case 3: y++; n = 2; break; case 4: x--; y++; n = 2; break; case 5: x--; n = 4; break; case 6: x--; y--; n = 4; break; case 7: y--; n = 6; 10 . việc nhận dạng biển số xe là rất cần thiết và cũng khá là quan trọng. Giới thiệu về ảnh biển số xe Ảnh biển số xe máy được dùng trong nhận dạng là một biển. kết quả nhận dạng Trong biển số xe có cả số và chữ nên việc phân chia ra nhận dạng số và chữ là cần thiết. Trong biến số chỉ có một chữ còn lại là số cả,