- Nhận diện mặt người qua tập dữ liệu có sẵn từ camera. - Nhận diện danh tính của người phạm tội qua ảnh chụp.
- Có thể kết hợp với nhiều thuật toán khác như: ICA, Neural,… để xử lý một cách chính xác hơn.
- Dò tìm và nhận dạng đối tượng vi phạm kỷ luật từ xa qua một thiết bị quan sát.
- Bảo mật hệ thống bằng cách nhận dạng khuôn mặt khi một hay nhiều đối tượng muốn ra vào một công ty, xí nghiệp, hay một cơ quan nào đó.
- Quản lý thời gian làm việc của các nhân viên của một xí nghiệp mà chỉ cần một camera quan sát.
Tài Liệu Tham Khảo
[1]. Ngô Hoàng Khắc Tiến, Trần Xuân Bách, Đồ án tốt nghiệp Dò tìm ảnh mặt người dùng PCA, Khoa Công nghệ điện tử, trường Đại học Công Nghiệp TP HCM, 2009.
[2]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập Môn Xử lý ảnh số, Nxb Khoa học và Kỹ thuật, 2002.
[3]. Võ Đức Khánh, Hoàng Văn Kiếm. Giáo trình xử lý ảnh số, Nhà xuất bản Đại học Quốc gia Thành phố Hồ Chi Minh, 2003.
[4]. Phạm Thế Bảo, Tổng quan các phương pháp xác định khuôn mặt người, Tạp chí bưu chính viễn thông.
[5]. Ngô Quốc Tạo, Ngô Phương Đông, Nguyễn Thanh Hòa, Phạm Việt Bình (2003), Báo cáo “Nhận dạng mặt người trong môi trường độ sáng không đồng nhất”, Hội thảo Công nghệ thông tin quốc gia lần thứ VIII, Thái Nguyên, 29- 31/8/2003.
[6]. Nguyễn Hoài Sơn, Giáo trình Matlab căn bản, Khoa Xây dựng và Cơ học ứng dụng, trường ĐHSPKT.
[7]. Burce A. Draper, Kyungim Baek, Marian Stewart Bartlett, J. Ross Beveridge,
“Recognizing Faces with PCA and ICA”.
[8]. Stan Z. Li , Anil K. Jain, “Handbook of Face Recognition”, 2006.
[9]. IEEE Computer Society, “Automatic face and gesture recognition”, 2004 [10]. Các Wedsite:
http://www.mathworks.com/matlabcentral/fileexchange/?term=Variable http://www.picvietnam.com/forum//showthread.php?t=387
www. diendandientu. com www. dientuvienthong. net
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
PHỤ LỤC
************ Chương trình chính***************
function varargout = luanvantotnghiep(varargin)
% LUANVANTOTNGHIEP M-file for luanvantotnghiep.fig
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @luanvantotnghiep_OpeningFcn, ... 'gui_OutputFcn', @luanvantotnghiep_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 luanvantotnghiep is made visible.
function luanvantotnghiep_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
function varargout = luanvantotnghiep_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
function THOAT_Callback(hObject, eventdata, handles) close1;
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles) chuongtrinh1;
delete(handles.figure1);
% --- Executes during object creation, after setting all properties.
function axes1_CreateFcn(hObject, eventdata, handles) imshow('anhnen.jpg');
% --- Executes during object creation, after setting all properties.
function axes3_CreateFcn(hObject, eventdata, handles) imshow('vo.jpg');
% --- Executes during object creation, after setting all properties.
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
imshow('logo.bmp');
****************************************************
**************Chương trình cắt ảnh tĩnh*********
function varargout = chuongtrinh1(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @chuongtrinh1_OpeningFcn, ... 'gui_OutputFcn', @chuongtrinh1_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
% --- Executes just before chuongtrinh1 is made visible.
function chuongtrinh1_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = chuongtrinh1_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
% --- Executes on button press in CHONANH.
function CHONANH_Callback(hObject, eventdata, handles) xoaanh;
chonanh;
% --- Executes on button press in TACHMAT.
function TACHMAT_Callback(hObject, eventdata, handles) axes(handles.axes4); imshow('anhluu/anh1.jpg'); axes(handles.axes5); imshow('anhluu/anh2.jpg'); axes(handles.axes6); imshow('anhluu/anh3.jpg'); axes(handles.axes7); imshow('anhluu/anh4.jpg');
% --- Executes on button press in Timmat.
function Timmat_Callback(hObject, eventdata, handles)
tic % tic là hàm đếm thời gian bắt đầu đếm
thuchien; % gọi hàm thuchien.m
axes(handles.axes2);
imshow('anhluu/anh_kq.jpg'); %hiện ảnh kết quả
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
% --- Executes on button press in NHANDANG.
function NHANDANG_Callback(hObject, eventdata, handles) tic
nhandang;
set(handles.times,'string',toc);
% --- Executes on button press in save1.
function save1_Callback(hObject, eventdata, handles) s=imread('anhluu/anh1.jpg');
save1;
% --- Executes on button press in save2.
function save2_Callback(hObject, eventdata, handles) s=imread('anhluu/anh2.jpg');
save1;
% --- Executes on button press in save3.
function save3_Callback(hObject, eventdata, handles) s=imread('anhluu/anh3.jpg');
save1;
% --- Executes on button press in save4.
function save4_Callback(hObject, eventdata, handles) s=imread('anhluu/anh4.jpg');
save1;
% --- Executes on button press in chon1.
function chon1_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh1.jpg'); a = strcat('anhluu/anhtest.jpg'); imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end
% --- Executes on button press in chon2.
function chon2_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh2.jpg'); a = strcat('anhluu/anhtest.jpg'); imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end
% --- Executes on button press in chon3.
function chon3_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh3.jpg');
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end
% --- Executes on button press in chon4.
function chon4_Callback(hObject, eventdata, handles) if (get(hObject,'Value') == get(hObject,'Max')) photo=imread('anhluu\anh4.jpg'); a = strcat('anhluu/anhtest.jpg'); imwrite(photo,a); set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' '); end
% --- Executes on button press in back.
function back_Callback(hObject, eventdata, handles) xoaanh;
luanvantotnghiep; delete(handles.figure1);
% --- Executes on button press in close.
function close_Callback(hObject, eventdata, handles) xoaanh;
luanvantotnghiep; delete(handles.figure1);
% --- Executes on button press in next.
function next_Callback(hObject, eventdata, handles) xoaanh; chuongtrinh2; delete(handles.figure1); **************************************************** **********Chương trình cắt ảnh động****************
function varargout = chuongtrinh2(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @chuongtrinh2_OpeningFcn, ... 'gui_OutputFcn', @chuongtrinh2_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
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
end
% End initialization code - DO NOT EDIT
% --- Executes just before chuongtrinh2 is made visible.
function chuongtrinh2_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line.
function varargout = chuongtrinh2_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
% --- Executes on button press in chupanh.
function chupanh_Callback(hObject, eventdata, handles) xoaanh;
global vid photo a photo = getsnapshot(vid);
selection = questdlg(['Ban muon chup anh gan hay xa?'],... ['Chuong trinh chup anh!'],...
'Gan','Xa','Yes'); if strcmp(selection,'Gan') axes(handles.axes1); photo=imresize(photo,0.5); imshow(photo); a = strcat('anhluu/anh_goc.jpg'); imwrite(photo,a);
elseif strcmp(selection,'Xa') axes(handles.axes1); imshow(photo); a = strcat('anhluu/anh_goc.jpg'); imwrite(photo,a); end
% --- Executes on button press in CAMERA.
function CAMERA_Callback(hObject, eventdata, handles) global vid
info = imaqhwinfo;
info = imaqhwinfo('winvideo'); info.DeviceInfo;
info.DeviceInfo.SupportedFormats;
vid = videoinput('winvideo',1,'YUY2_640x480'); set(vid,'ReturnedColorSpace','RGB');
preview(vid);
% --- Executes on button press in TACHMAT.
function TACHMAT_Callback(hObject, eventdata, handles) axes(handles.axes4); imshow('anhluu/anh1.jpg'); axes(handles.axes5); imshow('anhluu/anh2.jpg'); axes(handles.axes6); imshow('anhluu/anh3.jpg'); axes(handles.axes7); imshow('anhluu/anh4.jpg');
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
function Timmat_Callback(hObject, eventdata, handles) tic
thuchien;
axes(handles.axes2);
imshow('anhluu/anh_kq.jpg'); set(handles.times,'string',toc);
% --- Executes on button press in NHANDANG.
function NHANDANG_Callback(hObject, eventdata, handles) tic
nhandang;
set(handles.times,'string',toc);
% --- Executes on button press in save1.
function save1_Callback(hObject, eventdata, handles) s=imread('anhluu/anh1.jpg');
save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in save2.
function save2_Callback(hObject, eventdata, handles) s=imread('anhluu/anh2.jpg');
save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in save3.
function save3_Callback(hObject, eventdata, handles) s=imread('anhluu/anh3.jpg');
save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in save4.
function save4_Callback(hObject, eventdata, handles) s=imread('anhluu/anh4.jpg');
save1; %thực hiện chương trình để lưu ảnh chọn % --- Executes on button press in chon1.
function chon1_Callback(hObject, eventdata, handles)
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max”
photo=imread('anhluu\anh1.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng
a = strcat('anhluu/anhtest.jpg'); % con nếu không thì thôi không là gì hết
imwrite(photo,a);
set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' ');
end
% --- Executes on button press in chon2.
function chon2_Callback(hObject, eventdata, handles)
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max”
photo=imread('anhluu\anh2.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng
a = strcat('anhluu/anhtest.jpg'); % còn nếu không thì thôi không là gì hết
imwrite(photo,a);
set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' ');
end
% --- Executes on button press in chon3.
function chon3_Callback(hObject, eventdata, handles)
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
photo=imread('anhluu\anh3.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng
a = strcat('anhluu/anhtest.jpg'); % con nếu không thì thôi không là gì hết
imwrite(photo,a);
set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' ');
end
% --- Executes on button press in chon4.
function chon4_Callback(hObject, eventdata, handles)
if (get(hObject,'Value') == get(hObject,'Max')) % nếu đánh dấu nó mang “Max”
photo=imread('anhluu\anh4.jpg'); % chọn ảnh thực hiện cho chương trình nhận dạng
a = strcat('anhluu/anhtest.jpg'); % còn nếu không thì thôi không là gì hết
imwrite(photo,a);
set(handles.ten,'string',' '); set(handles.ns,'string',' '); set(handles.mssv,'string',' '); set(handles.lop,'string',' '); set(handles.quequan,'string',' ');
end
% --- Executes on button press in back.
function back_Callback(hObject, eventdata, handles)
xoaanh; % thực hiện xóa những tấm ảnh cũ trước khi thực
chuongtrinh1; %hiện chương trình xử lý ảnh mới
delete(handles.figure1);
% --- Executes on button press in close.
function close_Callback(hObject, eventdata, handles)
xoaanh; % thực hiện xóa những tấm ảnh cũ trước khi thực
luanvantotnghiep; %hiện chương trình xử lý ảnh mới
delete(handles.figure1); ********* Đoạn code thực hiện chương trình dò tìm và cắt ảnh************* face='face'; nface='nface'; %********************** TAO MATRAN CSDL************ [T1,T2] = taoCSDL(face,nface); %******************* TAO EF ************ [m1,m2,E1,E2] = taoEF(T1,T2);
%******************LOAD ANH DE XU LY**********
im1=imread('anhluu/anh_goc.jpg');
im= imresize(im1,0.2); % nén ảnh lại chỉ còn 20%
im =rgb2gray(im); % chuyển vềảnh xám chỉ mang giá trị 0 và 1 %***************** XAC DINH **************
[dong cot] = size(im);
anh1=im*255; % nhận toàn bộảnh với gí trị 255
anh2=im*255; for i=1:1:dong for j=1:1:cot tam=subim(im,i,j);
tam1=tam-m1; % m1 là giá trị trung bình của ảnh face
tam2=tam-m2; % m2 là giá trị trung bình của ảnh nace
sochieu1=size(E1,2); sochieu2=size(E2,2);
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu hinhchieu1=tam*0; hinhchieu2=hinhchieu1; for k=1:sochieu1 toado=(E1(:,k))'*tam1; hinhchieu1=hinhchieu1+toado*E1(:,k); end for k=1:sochieu2 toado=(E2(:,k))'*tam2; hinhchieu2=hinhchieu2+toado*E2(:,k); end kc1=norm(tam1-hinhchieu1)/20; kc2=norm(tam2-hinhchieu2)/20; anh1(i,j)=kc1; anh2(i,j)=kc2; end end b=strcat('anhluu/anh_face.jpg'); imwrite(anh1,b);
%******************* DANH DAU ANH ***********
%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ xacdinh(im1,im1,anh1,anh2); anh1=im1; anh=im1; face=anh1; nface=anh2;
******* Đoạn code tạo cơ sở dữ liệu cho chương trình dò tìm ảnh mặt**********
function [T1,T2] = taoCSDL(face,nface) csdl1 = dir(face);
csdl2=dir(nface); soanh1 = 0; soanh2=0;
% đếm tất cả các file ảnh có trong thư mục face và nface
for i = 1:size(csdl1,1)
if not(strcmp(csdl1(i).name,'.')|strcmp(csdl1(i).name,'..')|strcmp(csdl1(i).name,'Thumbs.db')) soanh1 = soanh1 + 1;
end end
for i = 1:size(csdl2,1)
if not(strcmp(csdl2(i).name,'.')|strcmp(csdl2(i).name,'..')|strcmp(csdl2(i).name,'Thumbs.db')) soanh2 = soanh2 + 1 ;
end end
T1 = []; % Tạo ma trận ảnh T1 chứa tập ảnh face
for i = 1 : soanh1
str = int2str(i); % hàm strcat nhằm liên kết các giá trị thành chuỗi
str = strcat('\',str,'.png'); % tiện cho quá trình truy xuất hay lưu lại giá trị mới
str = strcat(face,str); img = imread(str); try
img = rgb2gray(img); % chuyển tất cả vềảnh xám 0 1
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
end
[dong cot] = size(img); % mỗi tấm ảnh huấn luyện có kích thước 18*27 tam = reshape(img',dong*cot,1); % biến 1 ảnh thành 1 vecto có 1cột và 18*27 hàng
T1 = [T1 tam]; % tăng dần kích thước ma trận T1
End
% kết thúc ma trận T1 có kích thước 18*27x P với P là số cột của ma trận củng chính là sốảnh trong thư mục ảnh %huấn luyện face 18*27=486 chính là số dòng của ma trận ảnh T1 và tương tự ma trận T2 cũng vậy
T2 = []; % Bước này làm tương tự như tạo ma trận T1
for i = 1 : soanh2 % nhưng đối với ma trận ảnh nface
str = int2str(i); str = strcat('\',str,'.png'); str = strcat(nface,str); img = imread(str); try img = rgb2gray(img); catch end
[dong cot] = size(img); %dong 27 cot 18
tam = reshape(img',dong*cot,1); T2 = [T2 tam];
end
*********Đoạn code tạo enginface **************
function [m1,m2,E1,E2] = taoEF(T1,T2)
m1 = mean(T1,2); % Tính toán giá trịảnh trung bình
soanh1 = size(T1,2); m2 = mean(T2,2); soanh2=size(T2,2);
%Tính độ lệch giửa các bước ảnh huấn luyện với giá trịảnh trung bình sau đó trừđi giá trị trung bình của
ảnh trung bình và lưu các sai khác đó lại làm một ma trận ảnh mới ma trận đó là ma trận vecto riêng của ảnh huấn luyện, nhân ma trận vector riêng với ma trận nghịch đảo của nó và dùng hàm “eig” để tìm các vector riêng cho tập ảnh huấn luyện
A1 = []; for i = 1 : soanh1
temp = double(T1(:,i)) - m1; % T(:,i): vector cột thứ i chính là một bức ảnh
A1 = [A1 temp]; end A2 = []; for i = 1 : soanh2 temp = double(T2(:,i)) - m2; A2 = [A2 temp]; end L1 = A1'*A1;
[V1 D1] = eig(L1); %tìm vector riêng và trị riêng
L2 = A2'*A2; [V2 D2] = eig(L2);
%V chứa ma trận những vecto riêng, còn D chứa những trị riêng của các vector riêng đó, vector riêng V(:,i)
ứng với trị riêng là D(i,i)
D=diag(D1);
D=sort(D); % sắp sếp theo chiều tăng dần
s=size(D); s=s(1);
D=D(s-20); % chỉ giữ lại 20 trị riêng lớn nhất
LeigV1 = []; % và 20 vector riêng lớn nhất của tập ảnh huấn luyện
for i = 1 : size(V1,2) if( D1(i,i)>D )
LeigV1 = [LeigV1 V1(:,i)]; % tạo một ma trận mới chỉ gồm 20 vecto riêng
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
End %đều cho giá trị bằng 0
D=diag(D2); D=sort(D); s=size(D);s=s(1); D=D(s-30); LeigV2 = []; for i = 1 : size(V2,2) if( D2(i,i)>D )
LeigV2 = [LeigV2 V2(:,i)]; end end E1 = A1 * LeigV1; E2 = A2 * LeigV2; sovector=size(E1,2); for i=1:sovector dodai=norm(E1(:,i)); E1(:,i)=E1(:,i)/dodai; end sovector=size(E2,2); % sovector chính là số cột của ma trận for i=1:sovector
dodai=norm(E2(:,i)); % “norm” la tính giá trị bình phương trung bình
E2(:,i)=E2(:,i)/dodai; End
****** doan code xac dinh va cat anh khuon mat********
function xacdinh(anh1,anh,face,nface)
[dong,cot]=size(face); % vì phương pháp PCA là phương pháp xử lý ảnh theo khối
for i=15:1:dong-13; % do vậy khi xử lý ảnh ta thường cắt ảnh lớn ra thành từng
for j=8:1:cot-8; % tấm ảnh con để xử lý mà tấm ảnh xử lý phải có kích thước
s1=0.001; % bằng kích thước tấm ảnh trong tập ảnh huấn luyện
s2=0.001; % do vậy khi xử lý ta phải tính giá trị từ tâm của tấm ảnh
for i1=i-13:i+13 % để quét cho nên khi truy xuất ra hình Eigenface thường
for j1=j-7:j+7 % mất đi các đường viền xung quanh là vậy
if abs(i1-i)<3 && abs(j1-j)<2 s1=s1+double(face(i1,j1)); else s2=s2+double(face(i1,j1)); end end end
if s2/s1>21.8 && (nface(i,j)+nface(i-1,j)+nface(i+1,j))>89 && face(i,j)<31 && face(i-1,j)<31 && face(i+1,j)<31 && face(i-2,j)<31 && face(i+2,j)<31
kq(i,j)=255; % gán tại điểm ảnh phù hợp với các thông số
else % của khuôn mặt là 255 và các vị trí khác
kq(i,j)=0; % mang giá trị bằng 0
end end end %--- d=strcat('anhluu/anh_danhdau.jpg'); imwrite(kq,d); I=kq; anhkq=anh; anhkq1=anh1; [d,c]=size(I); % d là số dòng còn c là số cột của ma trận ảnh I
i1=1; i2=1; i3=1; i4=1; j1=1; j2=1; j3=1; j4=1; % khi tính toán ở hàm này thì i là cột và j là dòng
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu
d1=d*2/3; else d1=d-5; end
for i=1:c-5 % trong thuật toán này ta dùng vòng lặp for để
for j=1:d1 % tìm giá trị tại đó là 255 sau đó lưu nó lại
if I(j,i)>200 && i>10 % để tiện bề cho tính toán tách mặt sau này
i1=i; % vòng lặp for có một khuyết điểm là nó
j1=j; % chỉ dừng lại tại điểm cuối cho nên vấn đề
end % tìm kiếm được nhiều khuôn mặt gặp nhiều
end % khó khăn vòng lệnh lặp lại nhiều lẩn
end % tốn kém thời gian khi chạy chương trình
if i1-30>0 for i=1:i1-30 for j=1:d*2/3
if I(j,i)==255 && i>10 i2=i; j2=j; end end end end if i2-30>0 for i=1:i2-30 for j=1:d/2
if I(j,i)==255 && i>10 i3=i; j3=j; end end end end if i3-30>0 for i=1:i3-20 for j=1:d/2
if I(j,i)==255 && i>10 i4=i; j4=j; end end end end [d,c]=size(anhkq); if j1>1 &&i1>1
[j12,i12]=do(I,j1,i1); % gọi đến chương trình dò tìm tâm ảnh khuôn mặt
i1=i12-16; j1=j12-20;
if i1<1 % điều kiện này nhằm tránh lỗi khi cắt ảnh
i1=1; % mà cắt ảnh lấn ra ngoài khung ảnh
end if j1<1 j1=1; end i1=i1*5; j1=j1*5; i11=i1+149; j11=j1+199; if i11>c
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu i11=c; end if j11>d j11=d; end anh1=imcrop(anhkq1,[i1 j1 i11-i1 j11-j1]); a1=strcat('anhluu/anh1.jpg'); imwrite(anh1,a1); for c1=i1:i11
anhkq(j1,c1)=255; anhkq(j11,c1)=255; anhkq(j1-1,c1)=255; anhkq(j11-1,c1)=255; anhkq(j1-2,c1)=255; anhkq(j11-2,c1)=255; anhkq(j1-3,c1)=255; anhkq(j11-3,c1)=255; end
for d1=j1:j11
anhkq(d1,i1)=255; anhkq(d1,i11)=255; anhkq(d1,i1-1)=255; anhkq(d1,i11-1)=255; anhkq(d1,i1-2)=255; anhkq(d1,i11-2)=255; anhkq(d1,i1-3)=255; anhkq(d1,i11-3)=255; end end if j2>1 &&i2>1 [j22,i22]=do(I,j2,i2); i2=i22-16; j2=j22-20; if i2<1 i2=1; end if j2<1 j2=1; end i2=i2*5; j2=j2*5; i21=i2+149; j21=j2+199; if i21>c i21=c; end if j21>d j21=d; end anh1=imcrop(anhkq1,[i2 j2 i21-i2 j21-j2]); a1=strcat('anhluu/anh2.jpg'); imwrite(anh1,a1); for c1=i2:i21
anhkq(j2,c1)=255; anhkq(j21,c1)=255; anhkq(j2-1,c1)=255; anhkq(j21-1,c1)=255; anhkq(j2-2,c1)=255; anhkq(j21-2,c1)=255; anhkq(j2-3,c1)=255; anhkq(j21-3,c1)=255; end
for d1=j2:j21
anhkq(d1,i2)=255; anhkq(d1,i21)=255; anhkq(d1,i2-1)=255; anhkq(d1,i21-1)=255; anhkq(d1,i2-2)=255; anhkq(d1,i21-2)=255; anhkq(d1,i2-3)=255; anhkq(d1,i21-3)=255; end end if j3>1 &&i3>1 [j32,i32]=do(I,j3,i3); i3=i32-16; j3=j32-20; if i3<1 i3=1; end if j3<1 j3=1; end i3=i3*5; j3=j3*5; i31=i3+149; j31=j3+199; if i31>c i31=c; end if j31>d j31=d; end
GVHD: Ths. Đào Thị Thu Thủy SVTH: Nguyễn Trung Hiếu