1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nhận dạng biển số xe

24 3,3K 8
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nhận dạng biển số xe
Tác giả Đỗ Văn Tú, Đặng Ngọc Tuấn, Vũ Ngọc Hoàn, Lê Văn Diễn
Trường học Trường Đại học Công nghiệp Hà Nội
Chuyên ngành Công nghệ thông tin
Thể loại Bài tập môn
Năm xuất bản 2011
Thành phố Hà Nội
Định dạng
Số trang 24
Dung lượng 0,95 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nhận dạng biển số xe

Trang 1

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:

Trang 2

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

Trang 3

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.

Trang 5

Ví dụ ma trận của số 0 như sau:

Trang 6

this.Enabled = false;

OpenFileDialog OpenFileDialog = new OpenFileDialog();

OpenFileDialog.InitialDirectory = Application.StartupPath +

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

Trang 7

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:

publicstaticint[,] SoHoaAnh(Bitmap b)

{

BitmapData bmData = b.LockBits(newRectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite,

PixelFormat.Format24bppRgb);

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;

int[,] matrananhgoc = newint[b.Width, b.Height];

unsafe

{

byte* p = (byte*)(void*)Scan0;

int nOffset = stride - b.Width * 3;

for (int y = 0; y < b.Height; y++)

Trang 8

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;

for (int i = A_x; i < B_x+1; i++)

if (MaTranAnhGoc[i, A_y] == 1) hangtren = true;

for (int i = A_x; i < B_x+1; i++)

if (MaTranAnhGoc[i, B_y] == 1) hangduoi = true;

for (int i = A_y; i < B_y+1; i++)

if (MaTranAnhGoc[A_x, i] == 1) cottrai = true;

for (int i = A_y; i < B_y+1; i++)

if (MaTranAnhGoc[B_x, i] == 1) cotphai = true;

Trang 9

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

Trang 10

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; }

Trang 11

else if (y > Max_y) Max_y = y;

if ((x == mx) && (y == my)) check1 = false;

2.4 Khoanh vùng tìm chữ cái và chữ số trên ảnh

//(A_x,A_y)là tạo độ điểm đầu còn (B_x,B_y) là tọa độ điểm cuối

int y;

int nuatrai = (int)(A_x + (B_x - A_x) / 4);

int nuaphai = (int)(A_x + (B_x - A_x) * 3 / 4);

int giua = (int)(A_x + (B_x - A_x) / 2);

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);//lấy khung thôi

//số vùng bên phải

Trang 12

x = giua;

y = A_y;

tim_vitrixuatphat = true;

while (tim_vitrixuatphat)

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == nuatrai) { x = giua; y++; } else x ;

int[] sovung2 = ProcessImage.DoBien(MaTranAnhGoc, x, y);

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == nuaphai) { x = giua; y++; } else x++;

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == nuaphai) { x = B_x; y++; } else x ;

int[] chuso = ProcessImage.DoBien(MaTranAnhGoc, x, y);

int maxy;

if (sovung1[3] > sovung2[3]) maxy = sovung1[3]; else maxy = sovung2[3];

if (sovung2[3] > chu[3]) maxy = sovung2[3]; else maxy = chu[3];

if (chu[3] > chuso[3]) maxy = chu[3]; else maxy = chuso[3]; //// -

nuatrai = (sovung1[1] + sovung2[0]) / 2;

nuaphai = (chu[1] + chuso[0]) / 2;

//y = (int)(A_y + (B_y - A_y) * (3 / 4));

//bool ngan = true;

// for (int i = maxy + 10; i < B_y; i++)

// if (MaTranAnhGoc[nuatrai, i] == 1) ngan = true;

//}

//ngan = true;

Trang 13

// for (int i = maxy + 10; i < B_y; i++)

// if (MaTranAnhGoc[nuaphai, i] == 1) ngan = true;

//}

-

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == nuatrai) { x = A_x; y++; } else x++;

int[] so1 = ProcessImage.DoBien(MaTranAnhGoc, x, y);

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == giua-10) { x = so1[1] + 10; y++; } else x++;

int[] so2 = ProcessImage.DoBien(MaTranAnhGoc, x, y);

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == nuaphai) { x = giua; y++; } else x++;

int[] so3 = ProcessImage.DoBien(MaTranAnhGoc, x, y);

if (MaTranAnhGoc[x, y] == 1) tim_vitrixuatphat = false;

else if (x == nuaphai) { x = B_x; y++; } else x ;

int[] so4 = ProcessImage.DoBien(MaTranAnhGoc, x, y);

Trang 15

// chuyển đổi từ ảnh 2 màu sang ma trận tương ứng.

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

Trang 17

//tach doi tuong va chuẩn 10x20

public static int[,] chuan10x20(int[,] bm, int[] a)//mx,my độ rộng ảnh đầu vào

{

int[,] ketquatach=new int[a[1] - a[0] + 1,a[3] - a[2] + 1]; for (int j = 0; j <= (a[3] - a[2]); j++)

for (int i = 0; i <= (a[1] - a[0]); i++)

ketquatach[i, j] = bm[i + a[0], j + a[2]];

int[,] ketqua = new int[10, 20];

double tile_x = (a[1]-a[0]) / 10;

double tile_y = (a[3]-a[2]) / 20;

int xet = (int)((tile_x * tile_y) / 2);

Trang 18

int nVal = 0;

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;

unsafe

{

byte* p = (byte*)(void*)Scan0;

int nOffset = stride - b.Width * 3;

for (int y = 0; y < b.Height; y++)

Trang 19

3 Tối ưu hóa điểm ảnh để nhận dạng khi file ảnh không đủ chất lượng

Để hệ thống nhận dạng được chính xác hơn với những ảnh đầu vào có chất lượng thấp thì cần phải có một phần trong hệ thống để nâng cao chất lượng ảnh lên phục vụ cho quá trình nhận dạng được chính xác hơn.

Thay đổi mức phân ngưỡng

Phân ngưỡng để ảnh đầu vào chỉ còn lại 2 màu (tối và sáng) Tiện cho việc xử lý sau này.

Trong hệ thống thì có mức phân ngưỡng mặc định nhưng đối với một số ảnh thì mức đó là không phù hợp vì vậy cần phải thay đổi để phù hợp.

// Phân ngưỡng ảnh đầu vào thành ảnh chỉ với 2 màu

public static bool Nguongdon(Bitmap b, int nNguong)

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;

unsafe

{

byte* p = (byte*)(void*)Scan0;

int nOffset = stride - b.Width * 3;

for (int y = 0; y < b.Height; y++)

Trang 20

Tăng giảm độ sáng cho ảnh

Tăng giảm độ sáng vào độ tương phản cho ảnh để làm nổi bật các chữ số lên khi

ấy phân ngưỡng sẽ cho ra ảnh có chất lượng tốt hơn.

// hàm tăng giảm độ sáng cho ảnh

public static bool BrightNess(Bitmap b, int nBrightNess)

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;

unsafe

{

byte* p = (byte*)(void*)Scan0;

int nOffset = stride - b.Width * 3;

for (int y = 0; y < b.Height; y++)

Trang 22

Load ảnh:

Nhận dạng:

Trang 23

Nếu muốn nâng cao chất lượng ảnh:

Ta sử dụng nút “nâng cao ảnh”

Lúc này các chức năng của nâng cao sẽ hiện lên để xử lý ảnh đầu vào và muốn tiếp tục nhận dạng thì nhấn Exit.

Trang 24

ĐÁNH GIÁ HIỆU XUẤT VÀ KẾT LUẬN

Ngày đăng: 30/11/2013, 14:21

HÌNH ẢNH LIÊN QUAN

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ự đó: - Nhận dạng biển số xe
au 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ự đó: (Trang 9)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w