Professional Documents
Culture Documents
kỹ thuật lập tình Cơ Điện Tử
kỹ thuật lập tình Cơ Điện Tử
Ảnh xe và biển
Tách vùng chứa
số nhận từ
biển số
camera
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ự
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 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.
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.
Để 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.
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ả.
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ố.
#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:
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