/
3.3 CÁCH LY CÁC KÝ TỰ TRONG BIỂN SỐ
Sau đó tách biển số thành 2 hàng trên và dưới, mục đích cách làm này nhằm nhận dạng đúng thứ tự vị trí các ký tự nằm trên biển số. Vì khi biển số bị nghiêng so với thực tế, thuật toán ta chọn hoạt động theo trái qua phải và trên xuống dưới. Nếu không có giải pháp xử lý rất khó thực hiện đúng thứ tự trên biển số. Xây dựng 1 chương trình con dùng để thực hiện việc này.
Phương pháp này dựa vào cách tính điểm ảnh nhị phân trên cùng 1 hàng của ảnh. Nếu hàng đó có tổng các điểm ảnh bằng 0 ta tìm hàng từ trên xuống đến hàng có bằng 0 vậy ta đã có 1 hàng, hàng thứ 2 tìm tương tự như vậy.
Thuật toán:
Bắt đầu từ điểm ảnh ( x, y) đầu tiên (0,0), và đặt là dòng 0.
Quét đến hết chiều ngang của ảnh trên một giá trị y của ảnh.
Nếu là phát hiện điểm đen thì lưu giá trị y là đỉnh của hàng đầu tiên.
Quét đến dòng thứ I mà không phát hiện điểm đen thì đó là dòng cuối. Ta tiến hành tách vùng ảnh từ dòng 0 đến dòng I. đó là hàng thứ nhất của biển số xe.
Hình 3.9: Lưu đồ giải thuật cắt biển số thành 2 hàng
3.3.2 Cắt các ký tự trong 2 hàng
Đòi hỏi cần phải cắt đủ các ký tự. Nếu không đủ các ký tự cần phải mở camera chụp lại biển số.
Hình 3.10: Lưu đồ giải thuật cắt các ký tự
Tiến hành lần lượt với từng hàng biển số dùng kỹ thuật quét ảnh và phân vùng ảnh, sau đó lựa chọn ra các đối tượng trong ảnh sao cho phù hợp với kích thước và diện tích. Chuẩn hóa kích thước các đối tượng sau đó lưu lại các đối tượng vào một mảng, theo thứ tự từ các đối tượng trong biển số từ trái qua phải và từ trên xuống dưới.
3.4 CHƯƠNG TRÌNH NHẬN DẠNG BIỂN SỐ3.4.1 Tạo các mẫu 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);