/
4.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ụ đồ hoạ phục vụ nhập xuất dữ liệu một cách trực giác, rất thuận tiện. Ngoài ra có thể dùng GUI để giám sát các quá trình, hiển thị các đối tượng.
2. Cách làm việc của một GUI
GUI bao gồm các nút nhấn, hộp liệt kê, thanh trượt, menu..., chúng cung cấp cho người sử dụng một môi trường làm việc thân thiện để họ tập trung vào các ứng dụng của chương trình hơn là đi tìm hiểu cách thức làm việc của chương trình. Tuy nhiên, tạo ra GUI là công việc khó khăn đối với người lập trình bởi vì chương trình phải được xử lý với các click chuột cho bất kỳ thành phần nào của GUI và vào bất kỳ thời điểm nào. Trong MATLAB, để tạo ra một GUI lưu ý ba yêu cầu chính sau đây:
Component (các thành phần): mỗi đối tượng trong GUI (nút nhấn, nhãn, hộp soạn thảo, ...) là một thành phần. Các thành phần được phân loại thành: công cụ điều khiển (nút nhấn, hộp soạn thảo, thanh trượt, ...), các thành phần tĩnh (khung hình, chuỗi ký tự, ...), menu và axes (là các hệ trục dùng để hiển thị hình đồ họa). Các công cụ điều khiển và các thành phần tĩnh được tạo ra bởi hàm uicontrol, menu được tạo ra các hàm uimenu và
uicontextmenu, axes được tạo ra bởi hàm axes.
Figure : các thành phần của GUI phải được sắp xếp vào trong một figure, là một cửa sổ được hiển thị trên màn hình máy vi tính. Lệnh figure được sử dụng để chứa các thành phần của GUI.
Callback : cuối cùng, khi người dùng tác động vào chương trình bằng cách nhấn chuột hay gõ bàn phím thì chương trình phải đáp ứng lại mỗi sự kiện này. Ví dụ, trong trường hợp người sử dụng tác động vào một nút nhấn thì MATLAB sẽ thực thi một hàm tương ứng với nút nhấn đó. Mỗi thành phần của GUI phải callback lại một hàm tương ứng của nó.
3. Lệnh khởi tạo giao diện trong GUI 3.1 Giao diện GUI
Chọn biểu tượng guide trên thanh toolbar, hoặc thực hiện guide trên dòng lệnh cửa sổ GUIDE Quick Start
Có thể chọn các mẫu giao diện thiết kế sẵn hay bấm chọn GUI trống theo mặc định:
Một số lệnh thường dùng khi tạo GUI
Component Ý nghĩa
Axes Vẽ hệ trục
Edit text Hộp đưa vào văn bản
Frame Khung bao một vùng cửa sổ hình
List box Bảng các mục để chọn lựa
Pop-up menu
Menu sổ xuống, chọn lựa bằng chuột
Push button Nút nhấn, kích hoạt một hành động
Radio button
Giống check box nhưng chỉ chọn một
Slider Con trượt, đưa giá trị vào trong một tầm giới hạn
Static text Dòng văn bản để đặt tiêu đề, nhãn, hướng dẫn
Toggle button
Như push button nhưng hiển thị trạng thái khác nhau mỗi khi nhấn
Song song với việc tạo ra một giao diện .fig là một file .m. Nó chứa các nội dung có liên quan trực tiếp đến giao diện
Trong đó có một số biến thông dụng: - varargout: chỉ chung các đối số trả về
- varargin: Chỉ chung các đối số đưa vào hàm - nargin: Số lượng các đối số đưa vào
- nargout: Số lượng các đối số trả về
- handles: Cấu trúc handle của mọi component trong figure Ví dụ:
nút nhấn có tag pushbutton1 có handle là handles.pushbutton1
figure có tag figure1 có handle là handles.figure1
Bấm chuột trái vào các component muốn tạo, kéo chuột ra vùng layout, nơi muốn đặt component. Có thể dùng chuột để thay đổi kích thước component.
3.2 Soạn thảo các thuộc tính
Double click tại component để mở Inspect Properties định các thông số