Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 38

NHẬN DẠNG BIỂN SỐ XE

i
MỤC LỤC

DANH MỤC CÁC HÌNH VẼ.................................................................................vii


DANH MỤC CÁC TỪ VIẾT TẮT........................................................................viii
CHƯỚNG 1 TỔNG QUAN VỀ ĐỀ TÀI................................................................1
1.1 GIỚI THIỆU ĐỀ TÀI .........................................................................................1
1.1.1 Đặt vấn đề.........................................................................................................1
1.1.2 Khái quát về xử lý ảnh và nhận dạng biển số...................................................1
1.1.3 Phân loại ứng dụng nhận dạng biển số xe........................................................2
1.2. PHẦM MỀM VISUAL STUDIO VÀ THƯ VIỆN EMGUCV............................4
1.2.1 Phần mềm Visual Studio 2015...........................................................................4
1.2.2 Thư viện xử lý ảnh EmguCV..............................................................................4
CHƯƠNG 2. PHƯƠNG PHÁP NHẬN DẠNG BIỂN SỐ XE...............................6
2.1 MỘT SỐ KHÁI NIỆM CƠ BẢN.........................................................................6
2.1.1 Ảnh và điểm ảnh................................................................................................6
2.1.2 Các cách phân loại ảnh.....................................................................................6
2.1.3 Các giai đoạn xử lý ảnh.....................................................................................7
2.2 XÁC ĐỊNH VÙNG CHỨA BIỂN SỐ XE...........................................................8
2.2.1 Phân ngưỡng và tìm vùng đối tượng..................................................................8
2.2.2 Một số đặc điểm về biển số xe ở Việt Nam.........................................................8
2.2.3 Phát hiện vùng chứa biển số..............................................................................9
2.2.4 Nhận dạng các kí tự..........................................................................................11
CHƯƠNG 3. KẾT QUẢ MÔ PHỎNG..................................................................13
3.1 THIẾT KẾ WINDOW FORMS...........................................................................12
3.2 KẾT QUẢ NHẬN DẠNG...................................................................................13
CHƯƠNG 4. KẾT LUẬN.......................................................................................13
4.1 NHẬN XÉT.........................................................................................................14
4.2 HƯỚNG PHÁT TRIỂN......................................................................................14

ii
TÀI LIỆU THAM KHẢO.......................................................................................15
PHỤ LỤC................................................................................................................. 16

iii
DANH MỤC CÁC HÌNH VẼ

HÌNH 1-1 QUẢN LÝ BÃI GIỮ XE BẰNG NHẬN DẠNG BIỂN SỐ..................2
HÌNH 1-2 GIAO DIỆN CỦA VISUAL STUDIO 2015.........................................4
HÌNH 2-1 ẢNH MÀU, ẢNH MỨC XÁM VÀ ẢNH NHỊ PHÂN.........................7
HÌNH 2-2 CÁC BƯỚC XỬ LÝ ẢNH CƠ BẢN....................................................7
HÌNH 2-3 MỘT SỐ LOẠI BIỂN SỐ XE THÔNG DỤNG....................................9
HÌNH 2-4 CÁC BƯỚC PHÁT HIỆN VÙNG CHỨA BIỂN SỐ XE ...................10
HÌNH 3-1 GIAO DIỆN CHƯƠNG TRÌNH CHÍNH............................................12
HÌNH 3-2 CÔNG CỤ DEBUG................................................................................12
HÌNH 3-3 KẾT QUẢ NHẬN DẠNG BIỂN SỐ.....................................................13
HÌNH 3-4 CÁC LOẠI BIỂN KHÔNG NHẬN DẠNG ĐỦ KÍ TỰ......................13

iv
DANH MỤC CÁC TỪ VIẾT TẮT

ANPR Automatic number Plate Recognition


OCR Optical Character Recognition
RGB Red Green Blue

v
ĐỒ ÁN 3
Trang 1/33

CHƯƠNG 1:TỔNG QUAN VỀ ĐỀ TÀI

1.1.GIỚI THIỆU ĐỀ TÀI


1.1.1 Đặt vấn đề
Ngày nay trên thế giới bên cạnh việc tăng trưởng kinh tế là sự phát triển của các
ngành khoa học kỹ thuật nói chung, mà trong đó ngành công nghiệp sản xuất các
phương tiện giao thông lại là một trong những ngành có tốc độ phát triển cực nhanh.
Sự phát triển ấy, được thể hiện rõ ràng nhất thông qua hình ảnh các phương tiện
giao thông trên thế giới ngày một tăng cao và đa dạng. Tuy nhiên,điều đó lại gây ra
một áp lực đối với những người và cơ quan các cấp quản lý,làm cho công tác quản
lý và giám sát sẽ khó khăn hơn.
Và đây cũng là một trong những vấn nạn ở Việt Nam. Công tác quản lý phương tiện
giao thông nói chung và quản lý ôtô, xe máy là vô cùng phức tạp…cũng như công
tác phát hiện, xử phạt các hành vi vi phạm giao thông, chống trộm,…sẽ tốn nhiều
thời gian và công sức hơn.
Để làm giảm áp lực trong công tác quản lý, kiểm soát phương tiện giao thông, trên
thế giới đã nhanh chóng xây dựng hệ thống giám sát tự động đối với các phương
tiện giao thông. Và các hệ thống giám sát đều lấy biển số xe là mục tiêu giám sát.
Để xây dựng hệ thống quản lý giao thông tự động thì “ Bài toán nhận dạng biển số
xe” là tiền đề để xây dựng những mô hình quản lý đó. Hệ thống này đã được sử
dụng rộng rãi tuy nhiên ở Việt Nam đây vẫn là một lĩnh vực mới mẻ.

Nhận dạng biển số xe SVTH:Nguyễn Hoàng


Nam
Trang 2/33

Hình 1-1 Quản lý bãi giữ xe bằng nhận dang biển số

1.1.2 Khát quát về xử lý ảnh và nhận dạng biển số:


Xử lý ảnh là một trong những mảng quan trọng nhất trong kỹ thuật thị giác máy
tính, là tiền đề cho nhiều nghiên cứu thuộc lĩnh vực này. Hai nhiệm vụ cơ bản của
quá trình xử lý ảnh là nâng cao chất lượng thông tin hình ảnh và xử lý số liệu cung
cấp cho các quá trình khác trong đó có việc ứng dụng thị giác vào điều khiển.
Quá trình bắt đầu từ việc thu nhận ảnh nguồn (từ các thiết bị thu nhận ảnh dạng số
hoặc tương tự) gửi đến máy tính. Dữ liệu ảnh được lưu trữ ở định dạng phù hợp với
quá trình xử lý. Người lập trình sẽ tác động các thuật toán tương ứng lên dữ liệu ảnh
nhằm thay đổi cấu trúc ảnh phù hợp với các ứng dụng khác nhau.
Hê ̣ thống nhâ ̣n dạng biển số xe là hê ̣ thống có khả năng phân tích hình ảnh và xác
định biển số trên xe, thông qua video, thiết bị ghi hình và hình ảnh. Sau cùng là xác
định các thông tin như: chủ sở hữu xe, theo dõi xe với tốc đô ̣ châ ̣m, ....

1.1.3 Phân loại ứng dụng nhận dạng biển số xe:


Nhận dạng biển số xe
Trang 3/33

Ứng dụng nhận dạng biển số xe là ứng dụng có khả năng phân tích hình ảnh và xác
định biển số xe từ các hình ảnh chụp được từ các thiết bị thu hình. Nguồn hình ảnh
cho ứng dụng có rất nhiều. Và phát triển, hình ảnh được trực tiếp thu nhận từ
camera. Trong đề tài chỉ dừng lại ở mức xác định được biển số xe (xác định các
chữ) từ các bức ảnh.
Có nhiều cách thức khác nhau để phân loại các ứng dụng nhận dạng biển số
xe. Một trong những cách đơn giản là phân loại ứng dụng nhận dạng biển số xe
thông qua mục đích sử dụng. Có thể chia ứng dụng nhận dạng biển số xe thành hai
loại sau:
*Loạ i 1: Giớ i hạ n vù ng nhìn:
-Đầu vào: Ảnh thu trực tiếp từ các thiết bị ghi nhận ảnh kỹ thuật số. Ảnh được ghi
nhận thường chỉ giới hạn trong vùng có biển số xe.
-Nguyên lý hoạt động: Các phương tiện giao thông phải chạy với một tốc độ đủ
chậm để máy ghi nhận hình ảnh co thể thu được ảnh vùng biển số xe.
*Loại 2: Không giới hạn vùng nhìn:
-Đầu vào: Ảnh đầu vào thu được từ các thiết bị ghi hình tự động, không phụ thuộc
vào góc độ, các đối tượng xung quanh, ảnh không cần bắt buộc chỉ chụp vùng chứa
biển số xe, mà có thể ảnh tổng hợp như chứa them các đối tượng như người, cây,
đường phố.., miễn là vùng biển số xe phải đủ rõ để có thể thực hiện nhận dạng được
các ký tự trong vùng đó.
-Nguyên lý hoạt động: Do đặc tính không giới hạn vùng nhìn mà ảnh đầu vào có thể
thu được từ một thiết bị ghi hình (camara, máy ảnh…). Và do đó, công việc đầu tiên
là dò tìm trong ảnh, để xác định đúng vùng nào là biển số xe. Sau đó, thực hiện tách
vùng và nhận dạng. Vì không phụ thuộc vào hình ảnh thu được nên có thể dùng ứng
dụng tại nhiều nơi.

1.2 PHẦN MỀM VISUAL STUDIO 2015 VÀ THƯ VIỆN EMGUCV

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


Trang 4/33

1.2.1 Phần mềm Visual studio 2015


Visual Studio là mộ t mô i trườ ng tích hợ p từ Microsoft. Nó đượ c sử dụ ng để
phá t triển chương trình má y tính cho Microsoft Windows, cũ ng như cá c trang
web, cá c ứ ng dụ ng web và cá c dịch vụ web.
Visual Studio hỗ trợ nhiều ngô n ngữ lậ p trình khá c nhau và cho phép cá c lậ p
trình viên biên tậ p mã và gỡ lỗ i để hỗ trợ (mứ c độ khá c nhau) vớ i hầ u hết cá c
ngô n ngữ lậ p trình, cung cấ p mộ t dịch vụ ngô n ngữ cụ thể tồ n tạ i. . Ứ ng dụ ng
này đượ c xâ y dự ng trong ngô n ngữ bao gồ m C, C ++,VB,C#...
Tính năng chính của chương trình Visual Studio là biên tập code, sửa lỗi và thiết kế
Window Forms…

Hình 1-2 Giao diện của Visual Studio 2015

1.2.2 Thư viện xử lý ảnh EmguCV

OpenCV (Open Computer Vision) là mộ t thư viện mã nguồ n mở chuyên dù ng


để xử lý cá c vấn đề liên quan đến thị giá c má y tính. Nhờ mộ t hệ thố ng cá c giả i
thuậ t chuyên biệt, tố i ưu cho việc xử lý thị giá c má y tính, vì vậ y tính ứ ng dụ ng
củ a OpenCV là rấ t lớ n. EmguCV là mộ t cross flatform.NET, mộ t thư viện xử lý
hình ả nh mạ nh dà nh riêng cho ngô n ngữ C#, cho phép gọ i đượ c chứ c nă ng
củ a OpenCV từ .NET.
Lợ i thế cua EmguCV là đượ c viết hoà n toà n bằ ng C#  ,có thể chạ y trên bấ t kỳ
nền tả ng hỗ trợ nà o.

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


Trang 5/33

Tính ứ ng dụ ng củ a EmguCV là rấ t lớ n, có thể kể đến như nhậ n dạ ng ả nh ( nhậ n


dạ ng khuô n mặ t, cá c vậ t thể …),xử lý ả nh (khử nhiễu, điều chỉnh độ sá ng
… ),nhậ n dạ ng cử chỉ và cò n rấ t nhiều ứ ng dụ ng khá c nữ a.

CHƯƠNG 2:PHƯƠNG PHÁP NHẬN DẠNG BIỂN SỐ XE

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


Trang 6/33

2.1 MỘT SỐ KHÁI NIỆM CƠ BẢN:


2.1.1 Ảnh và điểm ảnh:
Ả nh số là tậ p hợ p hữ u hạ n cá c điểm ả nh vớ i mứ c xá m phù hợ p dù ng để mô tả
ả nh gầ n vớ i ả nh thậ t. Số điểm ả nh xá c định độ phâ n giả i củ a ả nh. Ả nh có độ
phâ n giả i cà ng cao thì cà ng thể hiện rõ nét cá c đặ t điểm củ a tấ m hình cà ng là m
cho tấ m ả nh trở nên thự c và sắ c nét hơn.

Ảnh là mảng số thực hai chiều ( I m ,n) , có kích thước (MxN), trong đó mỗi giá trị

( I m , n) (tại một điểm ảnh), biểu thị mức xám của ảnh tại vị trí ( m ,n ) tương

ứng.Một ảnh là ảnh nhị phân nếu giá trị ( I m ,n) bằng 0 hoặc 1.
Điểm ả nh (Pixel) là mộ t phầ n tử củ a ả nh số tạ i toạ độ (x, y) vớ i độ xá m hoặ c
mà u nhấ t định. Kích thướ c và khoả ng cá ch giữ a cá c điểm ả nh đó đượ c chọ n
thích hợ p sao cho mắ t ngườ i cả m nhậ n sự liên tụ c về khô ng gian và mứ c xá m
(hoặ c mà u) củ a ả nh số gầ n như ả nh thậ t. Mỗ i phầ n tử trong ma trậ n đượ c gọ i là
mộ t phầ n tử ả nh.
Mứ c xá m: Là kết quả củ a sự biến đổ i tương ứ ng 1 giá trị độ sá ng củ a 1 điểm
ả nh vớ i 1 giá trị nguyên dương. Thô ng thườ ng nó xá c định trong [0, 255] tuỳ
thuộ c và o giá trị mà mỗ i điểm ả nh đượ c biểu diễn. Cá c thang giá trị mứ c xá m
thô ng thườ ng: 16, 32, 64, 128, 256 (Mứ c 256 là mứ c phổ dụ ng. Lý do: từ kỹ
thuậ t má y tính dù ng 1 byte (8 bit) để biểu diễn mứ c xá m. Mứ c xá m dù ng 1 byte
biểu diễn: 28 =256 mứ c, tứ c là từ 0 đến 255).
2.1.2 Các cách phân loại ảnh
Ả nh nhị phâ n: Giá trị xá m củ a tấ t cả cá c điểm ả nh chỉ nhậ n giá trị 1 hoặ c 0 như
vậ y mỗ i điểm ả nh trong ả nh nhị phâ n đượ c biểu diễn bở i 1 bit. Ả nh xá m: Giá trị
xá m nằ m trong [0, 255] như vậ y mỗ i điểm ả nh trong ả nh nhị phâ n đượ c biểu
diễn bở i 1 byte.
Ảnh màu:
-Hệ màu RGB:

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


Trang 7/33

Mộ t pixel đượ c biểu diễn bằ ng 3 giá trị (R, G, B) trong đó R, G, B là mộ t giá trị
xá m và đượ c biểu biểu diễn bằ ng 1 byte. Khi đó ta có mộ t ả nh 24 bits.
P(x, y) = (R, G, B)
-Hệ mà u CMY: là phầ n bù củ a hệ mà u RGB, thườ ng đượ c dù ng trong má y in.
(C, M, Y) = (1, 1, 1) – (R, G, B)
Hay C+R=M+G=Y+B=1
-Hệ mà u CMYK: trong đó K là độ đậ m nhạ t củ a mà u
K= min(C, M, Y)
P(x, y) = (C-K, M-K, V-K, K).

Hình 2-1 Ảnh màu, ảnh mức xám và ảnh nhị phân

2.1.3 Các giai đoạn xử lý ảnh


Gồm các bước:
-Thu nhận ảnh: ảnh được thu từ nhiều nguồn khác nhau:máy ảnh, máy quay phim,
máy quét, ảnh vệ tinh biến đổi thông tin hình ảnh về các cấu trúc được lưu trữ trong
máy tính, có thể hiển thị ra các thiết bị ngoại vi.
-Tiền xử lý (Image Processing): quá trình sử dụng các kỹ thuật xử lý ảnh để làm ảnh
tốt lên theo mục đích sử dụng.
-Phân đoạn và biểu diễn ảnh.
-Nhận dạng và nội suy ảnh.

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


Trang 8/33

Hình 2-2 Các bước xử lý ảnh cơ bản

2.2 XÁC ĐỊNH VÙNG CHỨA BIỂN SỐ XE


2.2.1 Phân ngưỡng và tìm vùng đối tượng
Ý tưở ng: nhậ n thấ y cá c vù ng biển số là cá c vù ng đặ c trưng có hình chữ nhậ t, có
tỉ lệ kích thướ c theo tiêu chuẩ n. Vì vậ y sau khi tá ch ngườ ng và tìm vù ng
(EmguCV hỗ trợ findContours) ta tìm nhữ ng vù ng có tỷ lệ theo kích thướ c
giố ng vớ i tỉ lệ củ a biển số xe. Để có thế lọ c cá c vù ng biển số mộ t lầ n nữ a thì ta
tiếp tụ c tìm số vù ng con trên vù ng biển số và so sá nh vớ i số lượ ng ký tự củ a
biển số .
Gồ m 2 bướ c:
-Bướ c 1: Tìm vù ng biển số Vớ i ả nh xá m đầ u và o thự c hiện phâ n ngưỡ ng ( hoặ c
dò biên canny) và tìm đố i tượ ng. Tá ch cá c đố i tượ ng có tỉ lệ rộ ng/dà i trong
phạ m vi biển số để là m nguồ n cho bướ c 2.
-Bướ c 2: Tá ch riêng từ ng ký tự trên biển số : Tiến hà nh tìm đố i tượ ng trên
nguồ n do bướ c 1 cung cấ p sau đó so sá nh số đố i tượ ng nhậ n đượ c có trù ng vớ i
số ký tự tên cá c biển số xe khô ng. Nếu khớ p vớ i tiêu chuẩ n thì đó là nhữ ng
vù ng biển số có khả nă ng là biển số xe cao nhấ t. Tá ch riêng từ ng ký tự để nhậ n
dạ ng.
2.2.2 Một số đặc diểm biển số xe ở Việt Nam
Ở mỗ i nướ c thườ ng có tiêu chuẩ n về kích thướ c nhấ t định. Đố i vớ i nướ c ta,
biển số xe qui định khá đồ ng đều cho mỗ i loạ i xe, tỷ lệ chiều dà i, rộ ng cho mỗ i
loạ i xe là như nhau:
-Đố i vớ i loạ i xe có mộ t hàng ký tự thì tỉ lệ dà i/rộ ng là : 3.5 W / H  4.5.
-Đố i vớ i loạ i xe có hai hà ng ký tự thì tỉ lệ dà i/rộ ng là : 0.8 W / H 1.4.
Từ nhữ ng đặ c điểm nà y, ta có có thể xá c định đượ c cá c vù ng con thỏ a mã n thì
khả nă ng chứ a biển số là rấ t cao.
Mỗi ký tự thường có tỷ lệ kích thước chiều rộng, chiều cao tương ứng với chiều dài
và rộng của biển số xe. Ví dụ, chiều cao của mỗi ký tự luôn nhỏ hơn 85% chiều cao
của biển số xe và luôn lớn hơn 33% chiều cao của biển xe. Còn chiều rộng của ký
tự không lớn hơn 20% chiều dài của biển số xe. Mỗi ký tự của biển số xe được xem
như là một vùng liên thông con. Do đó, chúng ta có thể đếm vùng liên thông con

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


Trang 9/33

thỏa mãn tích chất đó là ký tự. Chú ý số ký tự trên biển số xe là từ 6 đến 10 ký tự. ở
nước ta chỉ có số ký tự trên mỗi biền số xe nằm trong khoảng 6 đến 9 ký tự.

Hình 2-3 Một số loại biển số xe thông dụng

2.2.3 Phát hiện vùng chứa biển số


Sơ đồ các bước phát hiện vùng chứa biển số xe.

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


Trang 10/33

Hình 2-4 Các bước phát hiện vùng chứa biển số xe

Bước 1: Biến đối ảnh xám và lọc ảnh


-Ảnh đầu vào là một ảnh bất kỳ, được chuyển về ảnh có 256 mức xám và tiến hành
lọc ảnh giảm nhiễu.
Bước 2: Nhị phân hóa ảnh
- Việc sử dụng ảnh mức xám không làm giảm đi tính đa năng của ứng dụng. Trên
thực tế, ảnh mức xám vẫn được sử dụng nhiều, và nhiều thiết bị ghi hình cũng có
khả năng tự chuyển ảnh màu thành ảnh mức xám. Tuy nhiên, nếu để ảnh mức xám
thì việc phát hiện biên không hiệu quả, vì sự thay đổi liên tục của các mức xám làm
cho việc xác định biên không phải dễ dàng, và việc tìm ra các vùng liên tục của biên
khá hạn chế. Vì vậy, chúng ta thực hiện chuyển ảnh về dạng nhị phân để thực hiện
việc lấy biên nhanh hơn.
Bước 3: Tiến hành phân ngưỡng hoặc phát hiện biên
-Có hai quá trình phân ngưỡng đó là phân ngưỡng tự động và phân ngưỡng
không tự động.
Nhận dạng biển số xe
Trang 11/33

-Khi ta tiến hành phân ngưỡng sẽ làm hiện rõ vùng biển số, trong giai đoạn này
ta có thể sử dụng các phương pháp phát hiện biên.
Bước 4: Tìm đường bao đối đượng
-Khi có ảnh thu được ở bước 3 chúng ta tiến hành tìm các vùng biên là đối tượng
riêng để trích các vùng và lấy thông số của các vùng như là tọa độ điểm của các
cạnh, diện tích của vùng.
Bước 5: Tách vùng biển số
-Tìm đường bao đối tượng với tiêu chí tỉ lệ 3.5  W H  4.5 hoặ c 0.8  W H 1.4 để
tìm ra nhữ ng vù ng có thể là biển số nhấ t.
-Tiến hà nh cắ t cá c vù ng có thể là biển số nhấ t trên ả nh để là m nguồ n cho giai
đoạ n cắ t ký tự để là m mẫ u cho cá c quá trình nhậ n dạ ng ký tự .
2.2.4 Nhận dạng các kí tự
Nhậ n dạ ng ký tự quang họ c (OCR) là loạ i phầ n mềm má y tính đượ c tạ o ra để
chuyển cá c hình ả nh củ a chữ viết tay hoặ c chữ đá nh má y (thườ ng đượ c quét
bằ ng má y scanner) thà nh cá c vă n bả n tà i liệu.
Trong đề tà i nà y chú ng ta sử dụ ng Tesseract OCR để nhậ n dạ ng cá ckí tự chữ và
số trong biển số xe.

CHƯƠNG 3:KẾT QUẢ MÔ PHỎNG


3.1 THIẾT KẾ WINDOW FORMS

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


Trang 12/33

Giao diện chương trình nhận dạng biển số:

Hình 3-1 Giao diện chương trình chính

Hình 3-2 Công cụ Debug

3.2 KẾT QUẢ NHẬN DẠNG


Ví dụ với biển số xe 62A 00222

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


Trang 13/33

Hình 3-3 Kết quả nhận dạng biển số xe

Kết quả nhận dạng chúng ta có thể thấy được là khá chính xác. Tuy nhiên vẫn có
một số biển số không nhận dạng được hoặc bị mất kí tự do các nguyên nhân sau:
-Ký tự không rõ và ký tự bị mờ từng phần cũng làm cho quá trình tìm đối tượng sẽ
phát hiện ra nhiều đối tượng mà không phát hiện ra vùng các chữ số.
-Chữ bị bóng sáng do kính lắp hoặc bị đèn chiếu làm nhòe.
-Ảnh bị che mất một phần nhỏ làm mất đi một phần ký tự hoặc ký tự dính liền với
đường viền của biển làm quá trình tìm đối tượng nhầm chữ số và viền của biển là
một đối tượng.
-Ảnh có nhiều nhiễu không rõ, nhiều nhiễu sẽ làm các ký tự gần nhau sẽ được tính
gần như là một đối tượng.

Hình 3-4 Các loại biển không nhận dạng đủ kí tự

Ngoài ra, chương trình cũng không nhận dạng dược các loại biển nền đỏ (xanh) chữ
trắng.

CHƯƠNG 4:KẾT LUẬN

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


Trang 14/33

4.1. NHẬN XÉT


Sự phát triển của công nghệ thông tin đã có tác động đến nhiều mặt của đời sống xã
hội trong đó phải kể đến lĩnh vực giám sát tự động. Trong giám sát tự động, việc
giám sát đối với các phương tiện giao thông là một vấn đề nổi trội. Nhiều chính
phủ, thành phố trên thế giới đã xây dựng hệ thống giám sát tự động đối với các
phương tiện giao thông của mình. Và các hệ thống giám sát đều lấy biển số xe là
mục tiêu giám sát.
Ở nước ta, các hệ thống giám sát tự động nói chung và các hệ thống nhận dạng biển
số xe nói riêng chưa được chú ý tới và nó cũng là một lĩnh vực tương đối mới mẻ.
Đa phần các công tác quản lý, xử lý đối với các phương tiện giao thông đều cần
nhân lực là con người. Đề tài này nhằm mục đích tìm hiểu bài toán giám sát, quản
lý các phương tiện giao thông một cách tự động thông qua việc “Nhận dạng biển số
xe”. Tôi hy vọng rằng trong thời gian không xa các hệ thống này được sử dụng
nhiều nhằm hỗ trợ một phần công tác giám sát, quản lý các phương tiện giao thông
một cách hiệu quả hơn.
4.2 HƯỚNG PHÁT TRIỂN
Nâng cao hiệu quả chương trình, tách ly các kí tự trong biển số trong các trường
hợp biển số bị nhiều nhiễu, mất mát thông tin do nhiễu từ điều kiện môi trường, tìm
vùng biển số trong ảnh có độ tương phản giữa biển số và nền thấp. Đặc biệt là biển
xe có nền màu đỏ (xanh) chữ trắng.
Phát triển chương trình thành module phần cứng. Có khả năng tương thích với các
thiết bị quan sát như camera.
Kết hợp chương trình với những chương trình nhận dạng khác để hỗ trợ tốt hơn cho
việc quản lý phương tiện giao thông. Nghiên cứu theo hướng một ứng dụng cụ thể
như : giám sát phương tiện giao thông, xử lý vi phạm giao thông, quản lý xe tại các
bãi giữ xe, các kho vật tư….

TÀI LIỆU THAM KHẢO


[1] tailieu.vn

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


Trang 15/33

[2] https://www.visualstudio.com/
[3] http://www.emgu.com/wiki/index.php/Documentation

PHỤ LỤC
*Code FindContours:

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


Trang 16/33

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Emgu.CV;
using Emgu.CV.Structure;

namespace Auto_parking
{
class FindContours
{
public int count = 0;
/// <summary>
/// Method used to process the image and set the output result images.
/// </summary>
/// <param name="colorImage">Source color image.</param>
/// <param name="thresholdValue">Value used for thresholding.</param>
/// <param name="processedGray">Resulting gray image.</param>
/// <param name="processedColor">Resulting color image.</param>
public int IdentifyContours(Bitmap colorImage, int thresholdValue, bool
invert, out Bitmap processedGray, out Bitmap processedColor, out List<Rectangle>
list)
{
List<Rectangle> listR = new List<Rectangle>();
#region Conversion To grayscale
Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
//grayImage = grayImage.Resize(400, 400,
Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR);

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


Trang 17/33

Image<Gray, byte> bi = new Image<Gray, byte>(grayImage.Width,


grayImage.Height);
Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);

#endregion

#region Image normalization and inversion (if required)

////CvInvoke.cvAdaptiveThreshold(grayImage, grayImage, 255,


////
Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRES
H_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 21, 2);
////string ff = grayImage.GetAverage().Intensity;

////grayImage = grayImage.ThresholdBinary(new
Gray(grayImage.GetAverage().Intensity / 2.5), new Gray(255));

////double thr = cout_avg(grayImage) / 1.5;


//double thr = cout_avg_new(grayImage)/1.5;
//grayImage = grayImage.ThresholdBinary(new Gray(thr), new Gray(255));
////grayImage = grayImage.Dilate(3);
//if (invert)
//{
// grayImage._Not();
//}
//#endregion

//#region Extracting the Contours

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


Trang 18/33

//using (MemStorage storage = new MemStorage())


//{

// Contour<Point> contours =
grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_C
HAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST,
storage);
// while (contours != null)
// {

// Rectangle rect = contours.BoundingRectangle;


// //Contour<Point> currentContour =
contours.ApproxPoly(contours.Perimeter * 0.015, storage);
// //color.Draw(currentContour.BoundingRectangle, new Bgr(0, 255, 0),
1);
// CvInvoke.cvDrawContours(color, contours, new MCvScalar(255,
255, 0), new MCvScalar(0), -1, 1,
Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));
// if (rect.Width > 20 && rect.Width < 150
// && rect.Height > 80 && rect.Height < 150)
// {
// count++;
// Contour<Point> currentContour =
contours.ApproxPoly(contours.Perimeter * 0.015, storage);
// CvInvoke.cvDrawContours(color, contours, new
MCvScalar(0,255,255), new MCvScalar(255), -1, 3,
Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));

// color.Draw(contours.BoundingRectangle, new Bgr(0, 255, 0), 2);

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


Trang 19/33

// bi.Draw(contours, new Gray(255), -1);


// listR.Add(contours.BoundingRectangle);

// }

// contours = contours.HNext;

// }
// for (int i = 0; i < count; i++)
// {
// for (int j = i + 1; j < count; j++)
// {
// if( (listR[j].X < (listR[i].X + listR[i].Width) && listR[j].X >
listR[i].X)
// && (listR[j].Y < (listR[i].Y + listR[i].Width) && listR[j].Y >
listR[i].Y) )
// {
// listR.RemoveAt(j);
// count--;
// j --;
// }
// else if( (listR[i].X < (listR[j].X + listR[j].Width) && listR[i].X >
listR[j].X)
// && (listR[i].Y < (listR[j].Y + listR[j].Width) && listR[i].Y >
listR[j].Y))
// {
// listR.RemoveAt(i);
// count--;

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


Trang 20/33

// i--;
// break;
// }

// }
// }
//}
#endregion

#region tim gia tri thresh de co so ky tu lon nhat

//Image<Gray, byte> bi2 = new Image<Gray, byte>(grayImage.Width,


grayImage.Height);
//Image<Bgr, byte> color2 = new Image<Bgr, byte>(colorImage);
//double thr = cout_avg_new(grayImage);
double thr = 0;
if (thr == 0)
{
thr = grayImage.GetAverage().Intensity;
}
//double thr = 50;
//double min = 0, max = 255;
//if (thr - 80 > 0)
//{
// min = thr - 80;
//}
//if (thr + 80 < 255)
//{
// max = thr + 80;

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


Trang 21/33

//}
//List<Rectangle> list_best = null;
Rectangle[] li = new Rectangle[9];
Image<Bgr, byte> color_b = new Image<Bgr, byte>(colorImage); ;
Image<Gray, byte> src_b = grayImage.Clone();
Image<Gray, byte> bi_b = bi.Clone();
Image<Bgr, byte> color2;
Image<Gray, byte> src;
Image<Gray, byte> bi2;
int c = 0, c_best = 0;
//IntPtr a = color_b.Ptr;
//CvInvoke.cvReleaseImage(ref a);
for (double value = 0; value <= 127; value += 3)
{
for (int s = -1; s <= 1 && s + value != 1; s += 2)
{
color2 = new Image<Bgr, byte>(colorImage);
//src = grayImage.Clone();
bi2 = bi.Clone();
listR.Clear();
//list_best.Clear();
c = 0;
double t = 127 + value * s;
src = grayImage.ThresholdBinary(new Gray(t), new Gray(255));

using (MemStorage storage = new MemStorage())


{

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


Trang 22/33

Contour<Point> contours =
src.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_
APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage);
while (contours != null)
{

Rectangle rect = contours.BoundingRectangle;


CvInvoke.cvDrawContours(color2, contours, new
MCvScalar(255, 255, 0), new MCvScalar(0), -1, 1,
Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));
double ratio = (double)rect.Width / rect.Height;
if (rect.Width > 20 && rect.Width < 150
&& rect.Height > 80 && rect.Height < 180
&& ratio > 0.1 && ratio < 1.1 && rect.X > 20)
{
c++;
CvInvoke.cvDrawContours(color2, contours, new
MCvScalar(0, 255, 255), new MCvScalar(255), -1, 3,
Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));

color2.Draw(contours.BoundingRectangle, new Bgr(0, 255, 0),


2);
bi2.Draw(contours, new Gray(255), -1);
listR.Add(contours.BoundingRectangle);

contours = contours.HNext;

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


Trang 23/33

}
}
//IntPtr a = color_b.Ptr;
//CvInvoke.cvReleaseImage(ref a);
double avg_h = 0;
double dis = 0;
for (int i = 0; i < c; i++)
{
avg_h += listR[i].Height;
for (int j = i + 1; j < c; j++)
{
if ((listR[j].X < (listR[i].X + listR[i].Width) && listR[j].X >
listR[i].X)
&& (listR[j].Y < (listR[i].Y + listR[i].Width) && listR[j].Y >
listR[i].Y))
{
//avg_h -= listR[j].Height;
listR.RemoveAt(j);
c--;
j--;
}
else if ((listR[i].X < (listR[j].X + listR[j].Width) && listR[i].X >
listR[j].X)
&& (listR[i].Y < (listR[j].Y + listR[j].Width) && listR[i].Y >
listR[j].Y))
{
avg_h -= listR[i].Height;
listR.RemoveAt(i);

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


Trang 24/33

c--;
i--;
break;
}

}
}
avg_h = avg_h / c;
for (int i = 0; i < c; i++)
{
dis += Math.Abs(avg_h - listR[i].Height);
}

if (c <= 8 && c > 1 && c > c_best && dis <= c * 8)


{
listR.CopyTo(li);
c_best = c;
color_b = color2;
bi_b = bi2;
src_b = src;
//dis_b = dis;
//if (c == 8)
//{
// break;
//}
}
}
if (c_best == 8) break;
}

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


Trang 25/33

count = c_best;
grayImage = src_b;
color = color_b;
bi = bi_b;
listR.Clear();
for (int i = 0; i < li.Length; i++)
{
if (li[i].Height != 0) listR.Add(li[i]);
}

#endregion

#region Asigning output


processedColor = color.ToBitmap();
processedGray = grayImage.ToBitmap();
list = listR;
#endregion
return count;
}
private double cout_avg(Image<Gray, byte> src)
{
double d = 0;
List<Rectangle> lsR = new List<Rectangle>();
Image<Gray, byte> grayImage = new Image<Gray, byte>(src.Width,
src.Height);
CvInvoke.cvAdaptiveThreshold(src, grayImage, 255,

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


Trang 26/33

Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRES
H_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 21, 2);
grayImage = grayImage.Dilate(3);
grayImage = grayImage.Erode(3);

using (MemStorage storage = new MemStorage())


{
Contour<Point> contours =
grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_C
HAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST,
storage);
while (contours != null)
{

Rectangle rect = contours.BoundingRectangle;

if (rect.Width > 50 && rect.Width < 150


&& rect.Height > 80 && rect.Height < 150)
{
lsR.Add(rect);
}
contours = contours.HNext;
}
}

for (int i = 0; i < lsR.Count; i++)


{
Bitmap tmp = src.ToBitmap();

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


Trang 27/33

Bitmap tmp2 = tmp.Clone(lsR[i], tmp.PixelFormat);


Image<Gray, byte> tmp3 = new Image<Gray, byte>(tmp2);
d += tmp3.GetAverage().Intensity / lsR.Count;
}

return d;
}
private double cout_avg_new(Image<Gray, byte> src)
{
double d = 0;
List<Rectangle> lsR = new List<Rectangle>();
Image<Gray, byte> grayImage = new Image<Gray, byte>(src.Width,
src.Height);

CvInvoke.cvAdaptiveThreshold(src, grayImage, 255,

Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRES
H_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 21, 2);

grayImage = grayImage.Dilate(3);
grayImage = grayImage.Erode(3);

using (MemStorage storage = new MemStorage())


{
Contour<Point> contours =
grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_C
HAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST,
storage);
while (contours != null)

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


Trang 28/33

Rectangle rect = contours.BoundingRectangle;


if (rect.Width > 50 && rect.Width < 150
&& rect.Height > 80 && rect.Height < 150)
{
lsR.Add(rect);
}
contours = contours.HNext;
}
}

for (int i = 0; i < lsR.Count; i++)


{
Bitmap tmp = src.ToBitmap();
Bitmap tmp2 = tmp.Clone(lsR[i], tmp.PixelFormat);
Image<Gray, byte> tmp3 = new Image<Gray, byte>(tmp2);
int T = 0;
int T0 = 128;
do
{
T = T0;
int m = 0, M = 0;
int min = 0, max = 0;
for (int y = 0; y < tmp3.Rows; y++)
for (int x = 0; x < tmp3.Cols; x++)
{
int value = (int)tmp3.Data[y, x, 0];
if (value <= T)

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


Trang 29/33

{
m++;
min += value;
}
else
{
M++;
max += value;
}
}
T0 = (min / m + max / M) / 2;
} while (T - T0 > 1 || T0 - T > 1);

d += (double)T0 / (double)lsR.Count;
}

return d;
}

private Image<Gray, byte> search(double thr, Image<Gray, byte> grayImage,


double min, double max
, out List<Rectangle> list_out, out int count, Image<Bgr, byte> color, out
Image<Bgr, byte> color_out,
Image<Gray, byte> bi, out Image<Gray, byte> bi_out)
{
List<Rectangle> listR = null, list_best = null;
Image<Bgr, byte> color2 = color;
Image<Gray, byte> src = grayImage;

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


Trang 30/33

Image<Gray, byte> bi2 = bi;

int c = 0, c_best = 0;
for (double value = min; value <= max; value += 0.1)
{

double t = thr / value;


src = grayImage.ThresholdBinary(new Gray(t), new Gray(255));

using (MemStorage storage = new MemStorage())


{

Contour<Point> contours =
src.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_
APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage);
while (contours != null)
{

Rectangle rect = contours.BoundingRectangle;


CvInvoke.cvDrawContours(color2, contours, new MCvScalar(255,
255, 0), new MCvScalar(0), -1, 1,
Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));
if (rect.Width > 20 && rect.Width < 150
&& rect.Height > 80 && rect.Height < 150)
{
c++;
CvInvoke.cvDrawContours(color2, contours, new MCvScalar(0,
255, 255), new MCvScalar(255), -1, 3,
Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));

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


Trang 31/33

color2.Draw(contours.BoundingRectangle, new Bgr(0, 255, 0), 2);


bi2.Draw(contours, new Gray(255), -1);
listR.Add(contours.BoundingRectangle);

contours = contours.HNext;

}
for (int i = 0; i < c; i++)
{
for (int j = i + 1; j < c; j++)
{
if ((listR[j].X < (listR[i].X + listR[i].Width) && listR[j].X >
listR[i].X)
&& (listR[j].Y < (listR[i].Y + listR[i].Width) && listR[j].Y >
listR[i].Y))
{
listR.RemoveAt(j);
c--;
j--;
}
else if ((listR[i].X < (listR[j].X + listR[j].Width) && listR[i].X >
listR[j].X)
&& (listR[i].Y < (listR[j].Y + listR[j].Width) && listR[i].Y >
listR[j].Y))
{

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


Trang 32/33

listR.RemoveAt(i);
c--;
i--;
break;
}

}
}
}
if (c <= 8 && c > c_best)
{
list_best = listR;
c_best = c;
if (c == 8)
{
color_out = color2;
bi_out = bi2;
list_out = list_best;
count = c_best;
return src;
}
}
}
color_out = color2;
bi_out = bi2;
list_out = list_best;
count = c_best;
return src;
}

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


Trang 33/33

}
}

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

You might also like