You are on page 1of 6

Mô hình ý tưởng về nhận dạng biển số xe

Đầu vào: Ảnh chụp xe và biển số xe

Đầu ra: chuỗi kí tự của biển số

I. Cơ sở lý thuyết và mô hình nghiên cứu


1. Tổng quan nhận dạng biển số
Đầu vào: Ảnh chụp xe và biển số xe
Đầu ra: chuỗi kí tự của biển số

Ảnh xe và biển
Tách vùng chứa
số nhận từ
biển số
camera

Phân cắt từng kí Trích chọn đặc


tự trưng

Tham chiếu mô
Đưa ra chuỗi ký
hình huấn luyện
tự của biển số
nhận dạng kí tự

Hình 1. Tổng quan mô hình nhận dạng biển số

2. Khối tách vùng biển số

Theo quy định của bộ công an, biển số xe đằng trước của các loại xe dân dụng là một hình chữ nhật,
có kích thước 470x110 (mm), phông nền màu trắng và các kí tự chữ cái in hoa màu đen. Các kí tự
chữ số bao gồm từ 0 tới 9 và các kí tự chữ số bao gồm A, B, C, D, E, F, G, H, K, L, M, N, P, S, T, U, V, X,
Y, Z (20 kí tự).

Ta sẽ dựa vào các đặc trưng học này để trích ra vùng chứa biển số xe, các bước thực hiện như sau:

Bước 1: Load ảnh, tiền xử lý ảnh (khử nhiễu, làm mịm …)

Bước 2: Chuyển ảnh ban đầu thành ảnh xám rồi nhị phân hóa ảnh đó.
Bước 3: Tìm các đường bao quanh đối tượng. Sau khi nhị phân ảnh, các đối tượng sẽ là các khối hình
đen trên nền trắng, với mỗi đối tượng ta luôn vẽ được một đường biên bao quanh đối tượng đó.

Bước 4: Xác định hình chữ nhật bao quanh các đường bao quanh đã tìm được từ bước 3. Đường bao
quanh được ở bước 3 là một chuỗi các điểm biên nối liền của đối tượng, dựa vào tọa độ của các
điểm biên này ta sẽ xác định được hình chữ nhật ngoại tiếp bao quanh đối tượng.

Bước 5: Tìm ra các hình chữ nhật có khả năng là vùng chứa biển số đựa vào các điều kiện về hình học
và điều kiện về số kí tự xác định được:

Tỉ lệ chiều dài/ rộng phải xấp xỉ 4:3. Trong cài đặt thực tế ta có thể cho tỉ lệ này dao động trong
khoảng [4.0, 4.5].

Số đối tượng thỏa mãn là một kí tự biển số trong vùng hình chữ nhật phải là một số lớn hơn một
ngưỡng nào đó. Với biển số xe 4 chữ số, số kí tự này là 7, với biển số xe mới với 5 kí tự số, số kí tự
này là 8, cũng có một số biển số xe có nhiều hơn 8 kí tự do có 2 kí tự chữ cái … Để xác định một đối
tượng là kí tự hay không, ta cũng sẽ dựa vào đặc điểm hình học của kí tự đó như tỉ lệ chiều dài/rộng
đối tượng, tỉ lệ chiều cao, dài của đối tượng so với tỉ lệ chiều cao, dài của hình chữ nhật đang được
xem xét là biển số, tỉ lệ pixel đen/trắng của dối tượng … Nếu xác định đó là một kí tự của biển số xe
ta cũng sẽ đồng thời lưu nó lại, đó chính là cách ta cách ly đối tượng trong biển số.

Ngoài ra, tùy thuộc vào điều kiện của bài toán ta có thể cố định thêm một số đặc tính để chắc chắn
hơn vùng chứa biển số, chẳng hạn như kích thước của hình chữ nhật không được vượt quá một nửa
kích thước của ảnh đầu vào, tỉ lệ pixel đen/trắng trong hình chữ nhật phải nằm trong một ngưỡng
nào đó

Sau khi đã xác định được vùng có khả năng là biển số, ta sẽ cắt vùng hình đó, đồng thời lấy ra các kí
tự trong vùng đó lưu vào một mảng để thực hiện việc nhận dạng.

3. Phân cắt từng kí tự

Bước đầu của công việc phân cắt ký tự tương tự như việc chúng ta đã làm ở bước phát hiện vùng
biển số, đó là việc xác định một đối tượng có là kí tự hay không dựa vào đặc điểm hình học mà ta đã
thực hiện ở Bước 5 ở trên

Sau khi đã khoanh vùng các ký tự bằng cách vẽ các hình chữ nhật, theo các hình chữ nhật đó cắt
riêng ra các ký tự riêng biệt và lưu chúng vào một mảng, lần lượt các ký tự sẽ được đưa vào chương
trình nhận dạng ký tự

4. Nhận dạng ký tự

Quá trình nhận dạng là quá trình đổi ma trận điểm ảnh của các ký tự thành mã ASCII tương ứng với
ký tự đó. Để làm được điều này, có thể đem so sánh ma trận của ký tự với tất cả các ma trận trong
tập mẫu, ma trận mẫu nào có khả năng giống nhiều nhất thì có chính là ký tự cần tìm. Các ma trận
mẫu này có được là nhờ sử dụng các phương pháp máy học, từ các mẫu kí tự sưu tầm được sẽ đưa
vào bộ huấn luyện, kết quả huấn luyện này sẽ được dùng để phát hiện các mẫu mới. Trong đề tài lần
này, chúng em sử dụng phương pháp máy học SVM để nhận dạng ký tự
SVM (Surport Vector Machine) là một mô hình máy học giám sát được dùng trong việc phân tích,
phân lớp dữ liệu dựa vào các siêu phẳng. Giả sử ta có một tập dữ liệu hai chiều như hình bên, khi đó
ta có thể phân lớp dữ liệu này thành hai phần nhờ một siêu. Siêu phẳng trong mặt phẳng là một
đường thằng, trong không gian 3 chiều là một mặt phẳng và tổng quát trong không gian n chiều là
một không gian n-1 chiều. Trong trường hợp dữ dữ liệu là không tuyến tính, ta cần ánh xạ tập dữ
liệu đó lên một không gian có số chiều lớn hơn để thuận tiện cho việc phân loại dữ liệu, nhiệm vụ là
cần phải tìm siêu phẳng sao cho khoảng cách tới các biên của dữ liệu là lớn nhất. Hiểu một cách đơn
giản về phương pháp này như sau: cho một tập các mẫu huấn luyện, với mỗi mẫu được gắn vào một
nhãn, quá trình huấn luyện SVM sẽ xây dựng một mô hình cho phép dự đoán một tập dữ diệu khác
thuộc về nhãn nào, tức phân loại tập dữ liệu đó thuộc vào lớp nào.

Để hiểu hơn về cách sử dụng phương pháp SVM để nhận diện được các ký tự thì chúng ta có thể
hiểu như sau.

Trước hết cần phải nhận thấy rằng SVM là một bộ máy phân loại dữ liệu, muốn sử dụng được nó ta
cần phải có dữ liệu, dữ liệu đối với các kí tự mà ta cần nhận dạng ở đây chính là các đặc trưng trong
ảnh của kí tự đó. Giả sử ta cần phân loại 30 lớp dữ liệu (tương ứng với 30 kí tự trong biển số xe), với
mỗi lớp dữ liệu, ta tính toán được 10 vector đặc trưng (10 mẫu), và mỗi vector đặc trưng tưng ứng
với các đặc trưng trong một ảnh. Khi đó ta sẽ đưa vào bộ huấn luyện SVM toàn bộ dữ liệu này, sau
đó với một ảnh bất kì, ta sẽ tính toán một vector đặc trưng của ảnh đó, mô hình SVM sẽ xem xét
xem dữ liệu này (tức vector đặc trưng này) thuộc vào lớp nào trong số những lớp mà nó đã được
huấn luyện.

Đặc trưng trong ảnh là những đặc điểm riêng biệt giúp phân biệt ảnh này với ảnh khác. Việc xem xét
như thế nào là các đặc trưng trong ảnh là một việc không có quy ước trước, nó phụ thuộc vào cách
nghiên cứu, cài đặt của từng trường hợp cụ thể và vẫn đang được nghiên cứu để đưa ra những
phương pháp tốt nhất.

Giả sử ta có hai kí tự như hình


bên, nhìn bằng mắt thường ta có
thể dễ dàng phân biệt được hai kí
tự 0 và 4, tuy nhiên làm sao để
máy tính phân biệt được hai kí tự
này? Bây giờ ta sẽ đưa hai kí
tự này về cùng một kích
thước, chia nhỏ các kí tự
thành 16 ô nhỏ khác nhau
như sau
Ta nhận thấy rằng nếu tính tổng các pixel đen trong các ô của hai bức ảnh thì số 0 và
số 4
có thể phân biệt dựa vào các ô (1,1), (1, 4), (2, 2), (3,3) … tại những ô đó, tổng số các
điểm ảnh đen là khác nhau hoàn toàn. Tính toán số điểm ảnh đen của 16 ô vuông này
ta có thể thu được 16 đặc trưng của một ảnh, 16 đặc trưng này đủ để phân biệt kí tự 0
và 4. Tuy nhiên, với 30 kí tự ta cần phải tính toán nhiều hơn các đặc trưng, các đặc
trưng không nhất thiết phải là 0 (tức không có điểm ảnh đen nào) hặc 1(tức là toàn số
điểm ảnh đen trong ô) mà có thể là một tỉ lệ tương đối nào đó. Từ 16 đặc trưng cơ bản
trên, ta kết hợp chúng lại để tạo ra những đặc trưng khác, chẳng hạn như lấy tổng các
đặc trưng trên đường chéo (1,1) + (2,2) + (3,3) + (4,4) hoặc tổng các đặc trưng xung
quanh đường biên của ảnh … số đặc trưng càng lớn thì việc phân loại các lớp càng ít
bị sai, có nghĩa là xác suất nhận dạng càng lớn

II. Công cụ, phần mềm hỗ trợ


1. Thư viện hỗ trợ - OpenCV

Để thực hiện đề tài này, nghiên cứ sử dụng thư viện OpenCV, thư viện này sẽ cung cấp nhiều tính
năng với các hàm xử lý ảnh có sẵn, thuận tiện hơn cho việc thực hiện cài đặt chương trình.

OpenCV (Open Computer Vision) là một thư viện mã nguồn mở hàng đầu cho xử lý về thị giác máy
tính, machine learning, xử lý ảnh. OpenCV đươc viết bằng C/C++, vì vậy có tốc độ tính toán rất
nhanh, có thể sử dụng với các ứng dụng liên quan đến thời gian thực. Opencv có các interface cho
C/C++, Python Java vì vậy hỗ trợ được cho Window, Linux, MacOs lẫn Android, iOS. OpenCV có hơn
500 hàm khác nhau, được chia làm nhiều phần phục vụ các công việc như: xử lý hình ảnh an ninh, y
tế, camera quan sát, nhận diện, lập trình cho robot.

2. Phân mềm hỗ trợ lập trình – Visual studio 2019

Visual studio 2019 là một IDE (Integrated Development Environment) phát triển bởi Microsoft và
được sử dụng cho các mục đích phát triển phần mềm khác nhau như phần mềm máy tính, website,
ứng dụng web, phần mềm trên thiết bị di động. Phần mềm bao gồm các công cụ, trình biên dịch
(Compiler), trình thông dịch (Interpreter), kiểm tra lỗi (Debugger) và hỗ trợ quản lý dự án để giúp
việc phát triển phần mềm thuận tiện hơn.

Giao diện thân thiện, khả năng hỗ trợ quản lý source code hiệu quả và được sử dụng phổ biến trên
thế giới với cộng đồng người dùng lớn cũng là những lý do để lựa chọn Visualstudio 2019 thay vì các
IDE khác, đặc biệt nó còn hỗ trợ xây dựng ứng dụng GUI một cách hiệu quả.

III. Cài đặt khối Nhận dạng biển số


Việc xây dựng khối Nhận dạng biển số được chia ra thành 3 phần dựa vào các khối công việc cần
thực hiện theo sơ đồ hình 1, bao gồm các công cụ được xây dựng trong các Lớp (Class) hay các Hàm
(Function) và được chia thành các thư viện như sau:

i. Class FindPlate được định nghĩa trong file FindPlate.h: Bao gồm các phương thức giúp tiền
xử lý ảnh đầu vào, tìm ra vùng chứa biển số và cắt vùng biến số.
ii. Class LP_Recognise được định nghĩa tỏng file Recognise.h: Bao gồm các phương thức giúp
thực hiện công việc cắt các ký tự và thực hiện nhận dạng từng ký tự được đưa vào.
iii. Các hàm được xây dựng trong thư viện Feature.h: Các hàm này được xây dựng với mục đích
tìm ra đặc trưng của từng bức ảnh chứa kí tự riêng biệt.
Ngoài ra để thuận tiện hơn cho việc lập trình ứng dụng Quản lý nhà đỗ xe thông minh, các công cụ
trên sẽ được đóng gói trong một thư viện Tool.h. Đây là thư viện được sử dụng duy nhất khi lập
trình giao diện của phần mềm để thực hiện công việc nhận dạng biển số.

Header file FindPlate.h

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <opencv/ml.h>
#include <stdio.h>
#include <stdlib.h>
class FindPlate
{
private:
IplConvKernel* S1;
IplConvKernel* S2;
IplImage* plate;
public:
void ImagePreprocessor(IplImage* scr);
IplImage* CatchPlate(IplImage* src);
FindPlate(void);
~FindPlate(void);
int CountCharacter(IplImage* Plateresult);

};

Có hai phương thức chính được xây dựng cho Class FindPlate bao gồm:

void ImagePreprocessor(IplImage* scr)

Thực hiện bước đầu tiên được gọi là tiền xử lý ảnh đầu vào. Sau khi nâng cao chất lượng hình ảnh,
resize về một kích cỡ chung, tiến hành nhị phân hóa với hàm cvThreshold(). Tiếp theo để phát hiện
các vùng có khả năng là biển số, ta thực hiện tìm những vùng có tỉ lệ pixel đen và pixel trắng phù hợp
với một vùng chứa biển số, ghi nhận những vùng đó và xóa những vùng hoàn toàn không có khả
năng là biển số khỏi bức ảnh nhị phân. Mô hình có thể được mô tả như sau

Sử dụng một hình chữ nhật


kích cỡ 16x32 lần lướt quét
qua ma trận ảnh nhị phân. Dựa
vào tính toán số pixel trắng
phù hợp thông qua hàm
cvCountNonZero() để cơ bản
phân loại những vùng có khả
năng là biển số. Những vùng
này sẽ được sao chép vào một
bức ảnh nhị phân đen cùng
kích cỡ. Kết quả của việc thực
hiện quá trình này có thể thấy
ở hình sau

You might also like