/
3.4 CHƯƠNG TRÌNH NHẬN DẠNG BIỂN SỐ
3.4.1 Tạo các mẫu
Nhận dạng các ký tự có trong ảnh đối tượng. Mô hình nhận dạng biển số xe, dựa vào phương pháp đối sánh mẫu dựa trên đặc trưng.
Xây dựng các mẫu vào các lớp khác nhau, sau đó gắn nhãn cho các lớp này.
Trích chọn đặc trưng:
Đây là bước biểu diễn các mẫu bằng các đặc trưng của đối tượng. Trong quá trình số liệu ảnh sẽ được thu gọn lại. Điều này hết sức cần thiết cho việc tiết kiệm bộ nhớ trong việc lưu trữ và thời gian tính toán. Một phương pháp trích chọn
đặc trưng tốt nếu như nó trích chọn các đặc trưng của đối tượng mà các đặc trưng đó sẽ giúp cho việc phân biệt được các lớp mẫu khác nhau, đồng thời nó cũng biến đổi được các thuộc tính cố hữu của đối tượng hay do các thiết bị thu nhận ảnh tạo ra.
Việc trích chọn các đối tượng đặc trưng của đối tượng là việc lựa chọn ra các yếu tố hình học. Sự biến đổi từng yếu tố riêng có thể làm thay đổi trật tự các đại lượng, điều này có thể làm ảnh hưởng đến việc phân lớp. Vấn đề này thường được giải quyết bằng một phép biến đổi tuyến tính thích hợp đối với các thành phần của vector đặc trưng.
Phân lớp :
Đây là bước quyết định trong quá trình nhận dạng. Tất cả các bước trong quá trình xử lý nhằm mục đích cho việc phân tách các mẫu thành công. Quá trình phân lớp có thể hiểu là quá trình chuyển đổi các số liệu đầu vào định lượng và các số liệu đầu ra định tính. Đầu ra của phân lớp có thể là sự lựa chọn rời rạc một lớp trong số các lớp đã được định nghĩa, hoặc có thể là một vector giá trị thực biểu diễn các giá trị có thể thừa nhận mẫu đó được hình thành từ các lớp tương ứng.
3.4.2 Tiến hành nhận dạng các ký tự
Các ký tự sau khi đã cách ly ta mang chúng phân thành các lớp giống như cách tạo ra các lớp mẫu. Như vậy, ta lựa chọn các lớp ký tự này so sánh lần lượt với các lớp có trong mẫu. Kết quả của mỗi lần so sánh tìm ra hệ số tương quan sau đó tiến hành lưu chúng cùng các lớp khác. Sau khi hoàn tất xong ta tiếp tục chọn trong các lớp xem lớp nào có hệ số tương quan lớn nhất, lớp này có tên gì tương ứng với ký tự nào ta xuất ra màn hình ký tự đó.
Phương pháp này đòi hởi cần phải có hai ảnh cùng kích thước. Công thức xác định hệ số tương quan:
Trong đó Amn là giá trị pixel tại cột m và hàng n, Bmn là giá trị pixel tại cột m và hàng n. và là giá trị trung bình của ma trận A và B.
Ví dụ: A = B = C = 6 2 4 3 7 21 7 6 3 1 3 1 1 0 9 12 12 3 2 1 3 4 1 8 33 88 119 49 0 0 2 2 1 28 132 156 150 90 1 1 2 1 0 14 133 130 144 86 10 10 1 1 0 0 86 112 69 16 2 4 2 1 0 0 18 14 0 0 2 3 3 1 0 0 3 1 2 3 3 3 3 1 0 0 0 1 2 3 4 4 1 1 0 0 0 0 0 2 5 6 2 4 3 7 21 7 6 3 1 3 1 1 0 9 12 12 3 2 1 3 4 1 8 33 88 119 49 0 0 2 2 1 28 132 156 150 90 1 1 2 1 0 14 133 130 144 86 10 10 1 1 0 0 86 112 69 16 2 4 2 1 0 0 18 14 0 0 2 3 3 1 0 0 3 1 2 3 3 3 3 1 0 0 0 1 2 3 4
Corr2(A,B) =1 Corr2(A,C) =0.3677
CHƯƠNG 4
KẾT QUẢ MÔ PHỎNG
4.1 GIAO DIỆN CHƯƠNG TRÌNH4.1.1 Giao diện chương trình 4.1.1 Giao diện chương trình
0 5 11 11 10 7 5 4 4 1 1 5 2 4 3 4 16 4 5 1 1 2 4 18 21 11 5 1 3 2 1 2 27 91 127 56 3 2 3 2 0 7 130 158 146 95 0 2 2 1 0 1 118 140 140 97 4 3 1 1 2 0 63 96 40 8 8 6 2 1 3 1 0 3 4 14 1 0 2 1 2 1 0 12 23 18 0 2 3 1 1 0 0 2 9 5 1 3 2 1
Hình 4.1.1: Giao diện chương trình
Hình 4.1.2: Giao diện khi cặp nhật ảnh nhận dạng
Hình 4.1.3: Kết quả nhận dạng
4.2 QUY TRÌNH NHẬN DẠNG
Quá trình nhận dạng biển số xe được thực hiện theo quy trình sau:
- Bước 1: Ảnh dữ liệu đầu vào (ảnh màu) sẽ được đưa lên giao diện chính.
- Bước 2: Ảnh màu được chuyển thành ảnh trắng đen trước khi đưa vào nhận dạng. - Bước 3: Trích vùng biển số cần nhận dạng từ ảnh trắng đen vừa thu được.
- Bước 5: Lựa chọn và sắp xếp các ký tự của vùng biển số - Bước 6: Nhận dạng ký tự và xuất ra giao diện chương trình
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
KẾT LUẬN
Đồ án thực hiện được các yêu cầu đã đặt ra, nhận dạng đúng biển số xe, tốc độ xử lý tương đối, giao tiếp với phần cứng (camera, webcam). Trong đó vẫn còn nhiều thiếu sót: xử lý chưa chính xác khi biển số bị nghiên, trong các điều kiện ánh sáng…
Kết quả nhận dạng toàn bộ chương trình chỉ ở mức chấp nhận được, khả năng sai lớn nhất của chương trình trong quá trình chạy thử nghiệm là sai mất một kí tự trong các kí tự nhận dạng được. Chính vì vậy, khả năng nhận dạng của chương trình không thể chính xác tuyệt đối.
Các ký tự có độ chính xác không cao thường gặp như: - Chữ D cho ra kết quả số 0.
- Chữ Y cho ra kết quả chữ T. - Số 2 cho ra kết quả chữ Z.
Khi nhận dạng ở trạng thái đáp ứng thực trong quá trình chụp ảnh nếu thu ảnh không rõ nét ( góc ảnh, ảnh bị nhiễu do ánh sáng chiếu vào) thì kết quả vẫn không đạt được mong muốn.
HƯỚNG PHÁT TRIỂN ĐỀ TÀI
Việc khắc phục những mặt hạn chế sẽ cải thiện được chương trình cũng như khả năng đáp ứng thời gian thực.
Trong thực tế, việc điều kiện môi trường xung quanh ảnh hưởng rất lớn đến việc định vị biển số xe, như vậy cần phải thiết lập một môi trường ổn định xung quanh như:
- Cường độ ánh sáng phải thích hợp để ảnh không bị nhiễu.
- Cũng như Camera phải đạt chất lượng tốt có tính cảm biến cao trong mọi điều kiện khách quan.
Khi đáp ứng như trên thì sẽ tăng độ chính xác của chương trình và kết quả nhận dạng tương đối chính xác.
Việc thu thập và tạo ra càng nhiều các kí tự để tăng kích thước tập mẫu cũng tăng độ chính xác của chương trình. Do đó, đây cũng chính là một trong những hướng để cải thiện chương trình.
Trong điều kiện thực tế (kinh phí, thời gian…) ở trạng thái đáp ứng thực ta không thể chụp ảnh tự động thông qua hệ thống cảm biến được.
Chương trình có khả năng ứng dụng cao trong thực tiễn, giúp việc xử lý hình ảnh và dữ liệu trở nên đơn giản và cũng là tiền đề cho các hệ thống nhận dạng tự động. Việc ứng dụng các công nghệ bán dẫn cho các hệ thống nhận dạng tự động làm tăng khả năng đáp ứng thời gian thực, đây cũng chính là hướng phát triển của đề tài.
Kết hợp chương trình vào thực tế với việc quẹt thẻ tự động thu phí hoặc in xuất biển số xe cho khách hàng. Đồng thời ghi chú xe ra vào theo tháng, khách hàng thân thuộc…
PHỤ LỤC
I . CODE CHƯƠNG TRÌNH 1. Chương trình chính
function varargout = NDBSX(varargin)
% NDBSX M-file for NDBSX.fig
% NDBSX, by itself, creates a new NDBSX or raises the existing % singleton*.
% H = NDBSX returns the handle to a new NDBSX or the handle to % the existing singleton*.
% NDBSX('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in NDBSX.M with the given input arguments. % NDBSX('Property','Value',...) creates a new NDBSX or raises the
% existing singleton*. Starting from the left, property value pairs are % applied to the GUI before NDBSX_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application % stop. All inputs are passed to NDBSX_OpeningFcn via varargin.
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help NDBSX % Last Modified by GUIDE v2.5 04-May-2011 15:41:28 % Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @NDBSX_OpeningFcn, ...
'gui_OutputFcn', @NDBSX_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT % Executes just before NDBSX is made visible.
% This function has no output args, see OutputFcn. % hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to NDBSX (see VARARGIN) % Choose default command line output for NDBSX
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes NDBSX wait for user response (see UIRESUME) % uiwait(handles.figure1);
% Outputs from this function are returned to the command line. function varargout = NDBSX_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure
varargout{1} = handles.output;
% Executes on button press in chon_anh.
function chon_anh_Callback(hObject, eventdata, handles)
% hObject handle to chon_anh (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile({'*.jpg';'*.bmp';'*.gif';'*.*'}, 'Pick an Image File'); S = imread([pathname,filename]);
axes(handles.axes1); imshow(S);
% handles.S=S;
% guidata(hObject, handles);
J=rgb2gray(S);
% chuyen sang anh Gray
[angle, line] = find_angle(J); K=imrotate(J,angle,'bilinear'); axes(handles.axes2); imshow(K); handles.K=K; guidata(hObject, handles); % threshold = graythresh(K); % lay nguong
% imagen =~im2bw(K,threshold);%~ doi bit anh nhi phan,dang mau trang thanh mau den
% axes(handles.axes4); % imshow(imagen);
% handles.imagen=imagen; % guidata(hObject, handles);
% --- Executes on button press in webcam.
function webcam_Callback(hObject, eventdata, handles)
% hObject handle to webcam (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
a=get(handles.webcam,'String'); axes(handles.axes1);
dev_info = imaqhwinfo('winvideo',1); celldisp(dev_info.SupportedFormats); obj = videoinput('winvideo',1);
set(obj, 'SelectedSourceName', 'input1'); src_obj = getselectedsource(obj);
get(src_obj); preview(obj); w = waitforbuttonpress; S = getsnapshot(obj); imshow(S); delete(obj); handles.S=S; guidata(hObject, handles);
% --- Executes on button press in select.
function select_Callback(hObject, eventdata, handles)
% hObject handle to select (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % S = handles.S;
axes(handles.axes2);
% sz = size(S);%hien thi sz thi ra hinh ma tran 1:1
handles.hRect = imrect(gca,[50 5 600 500]); % 2 so
% dau la toa do x,y di chuyen, 2 so sau la chieu rong va chieu cao
handles.api = iptgetapi(handles.hRect);
% tao ra cai khung cat hinh
guidata(hObject, handles);
% --- Executes on button press in crop.
function crop_Callback(hObject, eventdata, handles)
% hObject handle to crop (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.loc = handles.api.getPosition(); K = handles.K;
handles.img_crop = imcrop(K,handles.loc);
% cat anh S voi kich thuuoc lay o tren khung da chon
I=handles.img_crop; imshow(I);
% handles.I=I;
% guidata(hObject, handles);
% J=rgb2gray(I);% chuyen sang anh Gray % [angle, line] = find_angle(J);
% K=imrotate(J,angle,'bilinear'); % axes(handles.axes3); % imshow(J); % handles.J=J; % guidata(hObject, handles); % imagen=handles.J; threshold = graythresh(I); % lay nguong imagen =~im2bw(I,threshold);
% doi bit anh nhi phan,dang mau trang thanh mau den
axes(handles.axes4); imshow(imagen);
handles.imagen=imagen; guidata(hObject, handles);
% --- Executes on button press in nhandang.
function nhandang_Callback(hObject, eventdata, handles)
% G=handles.J; % h=imhist(I); % h1=h(1:10:256); % horz=1:10:256; % axes(handles.axes10); % bar(horz,h1); imagen=handles.imagen; imagen = bwareaopen(imagen,800);
% loai bo nhung ky tu hay nhung diem nho hon 30 pixels. word=[ ]; a=[ ]; re=imagen; % Load templates load templates global templates
% Compute the number of letters in template file
num_letras=size(templates,2);
while 1
% Fcn 'lines' separate lines in text
[fl re]=lines(re); imgn=fl;
% Uncomment line below to see lines one by one % imshow(fl);pause(0.5)
%--- % Label and count connected components
[L Ne] = bwlabel(imgn); for n=1:Ne
[r,c] = find(L==n); % Extract letter
n1=imgn(min(r):max(r),min(c):max(c)); % Resize letter (same size of template)
img_r=imresize(n1,[42 24]);
% Call fcn to convert image to text
letter=read_letter(img_r,num_letras); % Letter concatenation word=[word letter]; a=[a img_r]; end axes(handles.axes5);
imshow(a);
set(handles.text1,'string',word); % Clear 'word' variable
% *When the sentences finish, breaks the loop
if isempty(re);
% See variable 're' in Fcn 'lines'
break
end
end
% --- Executes on button press in thoat.
function thoat_Callback(hObject, eventdata, handles)
% hObject handle to thoat (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
close
2. Chương trình con xoay ảnh
function [angle, line] = find_angle(gray_image);
% find_angle: Determines the angle of the supplied picture: it is supposed % that the picture contains parallel lines or at least one large line.
% The function uses the Radon transform in order to find lines on the picture, % and returns the angle of the most visible line, and a matrix representation of % the largest lines on the picture.
% gray_image = rgb2gray(rgb_image); % figure;
% imshow(gray_image)
theta = (0:179)';
% Determining the lines on the picture using the Radon Transform: % thresh1=graythresh(gray_image);
% edge(I,'sobel',thresh1)
[R, xp] = radon(edge(gray_image,'canny'), theta);%canny: noi ro duong bien % imshow([R, xp])
% Determining the largest lines on the picture:
i = find(R > (max(R(:)) - 10)); [foo, ind] = sort(-R(i));
[y, x] = ind2sub(size(R), i); t = -theta(x)*pi/180;
r = xp(y);
% Forming a matrix representation of the found lines:
line = [cos(t) sin(t) -r];
cx = size(gray_image, 2)/2 - 1; cy = size(gray_image, 1)/2 - 1;
line(:,3) = line(:,3) - line(:,1)*cx - line(:,2)*cy;
% Finding the angle of the most visible line on the picture:
[r,c] = find(R == max(R(:))); thetap = theta(c(1));
angle = 90 - thetap;
return;
3. Chương trình con trích xuất ký tự
function [fl re]=lines(im_texto)
% Divide text in lines
% im_texto->input image; fl->first line; re->remain line % Example:
% im_texto=imread('TEST_3.jpg'); % [fl re]=lines(im_texto);
% subplot(3,1,1);imshow(im_texto);title('INPUT IMAGE') % subplot(3,1,2);imshow(fl);title('FIRST LINE')
% subplot(3,1,3);imshow(re);title('REMAIN LINES') im_texto=clip(im_texto); num_filas=size(im_texto,1); for s=1:num_filas if sum(im_texto(s,:))==0 nm=im_texto(1:s-1, :);
% First line matrix
rm=im_texto(s:end, :);
% Remain line matrix
fl = clip(nm); re=clip(rm); break
else
fl=im_texto;
% Only one line.
re=[ ]; end end function img_out=clip(img_in) [f c]=find(img_in); img_out=img_in(min(f):max(f),min(c):max(c)); % Crops image
4. Chương trình con trích xuất ký tự
function letter=read_letter(imagn,num_letras)
% Computes the correlation between template and input image % and its output is a string containing the letter.
% Size of 'imagn' must be 42 x 24 pixels % Example:
% imagn=imread('D.bmp'); % letter=read_letter(imagn)
global templates comp=[ ]; for n=1:num_letras sem=corr2(templates{1,n},imagn); comp=[comp sem]; end vd=find(comp==max(comp)); %*-*-*-*-*-*-*-*-*-*-*-*-*- if vd==1 letter='A'; elseif vd==2 letter='B'; elseif vd==3 letter='C'; elseif vd==4 letter='D'; elseif vd==5 letter='E'; elseif vd==6 letter='F'; elseif vd==7 letter='G'; elseif vd==8 letter='H'; elseif vd==9 letter='I'; elseif vd==10 letter='J'; elseif vd==11 letter='K'; elseif vd==12
letter='L'; elseif vd==13 letter='M'; elseif vd==14 letter='N'; elseif vd==15 letter='O'; elseif vd==16 letter='P'; elseif vd==17 letter='Q'; elseif vd==18 letter='R'; elseif vd==19 letter='S'; elseif vd==20 letter='T'; elseif vd==21 letter='U'; elseif vd==22 letter='V'; elseif vd==23 letter='W'; elseif vd==24 letter='X'; elseif vd==25 letter='Y'; elseif vd==26 letter='Z'; %*-*-*-*-* elseif vd==27
letter='1'; elseif vd==28 letter='2'; elseif vd==29 letter='3'; elseif vd==30 letter='4'; elseif vd==31 letter='5'; elseif vd==32 letter='6'; elseif vd==33 letter='7'; elseif vd==34 letter='8'; elseif vd==35 letter='9'; elseif vd==36 letter='0'; elseif vd==37 letter='.'; else letter='-'; end
II . HƯỚNG DẪN TẠO GIAO DIỆN 1. Khái niệm chung
Giao diện người sử dụng (Graphical User Interface – GUI) là giao diện bằng hình ảnh của chương trình. Một GUI tốt có thể làm cho chương trình trở nên dễ sử dụng bằng cách cung cấp thông tin ban đầu cần thiết và với những công cụ điều khiển như : nút nhấn (pushbutton), hộp liệt kê (list box), thanh trượt (slider), trình
đơn (menu),... GUI thường được thiết kế dễ hiểu và thân thiện với người sử dụng (đối tượng chỉ sử dụng chương trình mà không cần quan tâm đến mã code).
Trong giao diện này ta có thể xuất dữ liệu dưới 2 dạng: văn bản và đồ hoạ. Mỗi một GUI có một hay nhiều layout(diện mạo). Việc tạo GUI tạo nên một công cụ