Là tập hợp những ảnh ảnh trung bình E: là những vector riêng của ma trận A*A’.

Một phần của tài liệu LUẬN VĂN ĐIỆN TỬ HỆ THỐNG BẢO MẬT (Trang 69 - 77)

- Sử dụng một webcam để chụp hình ảnh người và đưa vào máy tính dùng

A: là tập hợp những ảnh ảnh trung bình E: là những vector riêng của ma trận A*A’.

A*A’ kích thước M*NxM*N q lớn, ta sẽ tìm những vector riêng cả ma trận A’*A kích thước PxP. Ta sẽ tìm những vector riêng bằng hàm eig trong MatLab. % Giả sử v là một vector riêng của ma trận A’*A, khi đĩ A*v là vector riêng của ma trận A*A’.

% Tập hợp những vector riêng của ma trận A*A’ gọi là Eigenfaces. % Trả về 3 giá tri:

m: là ảnh trung bình.

A: là tập hợp những ảnh - ảnh trung bình.E: là những vector riêng của ma trận A*A’. E: là những vector riêng của ma trận A*A’. % Tính tốn ảnh trung bình.

m = mean(T,2); % giá trị trung bình. soanh = size(T,2);

% Tính độ lệch giữa ảnh kiểm tra với ảnh trung bình

A = [];

for i = 1 : soanh

temp = double(T(:,i)) - m;% T(:,i): vector cột thứ I chính là một bức ảnh. A = [A temp];

end

% Tìm những trị riêng và những vector riêng của ma trận A’*A, từ đĩ tìm những vector riêng của ma trận A*A’ là những eigenface.

L = A'*A;

[V D] = eig(L); % Tính trị riêng và vector riêng.

% V chứa những vector riêng, cịn D chứa những trị riêng trong độ vector riêng V(:,i) ứng với trị triêng D(i,i).

% Nĩi cách khác D là ma trận chéo của các trị riêng, cịn V là ma trận mà các cột là vector riêng.

D1=diag(D); % tạo ma trận chéo từ ma trận D. D1=sort(D1);

s=size(D1); s=s(1);

LeigV = []; % Tập hợp vector riêng của ma trận L = A’*A.

for i = 1 : size(V,2)

if( D(i,i)>D1 )

LeigV = [LeigV V(:,i)]; end

end

%ta chi lay 14 vector rieng ung voi 10 tri rieng lon nhat

%nhu da noi o tren , sau khi co cac vector rieng cua ma tran A'*A , ta tim %cac vector rieng cua ma tran A*A' bang cach lay ma tran A nhan voi cac %vector rieng nay , tap hop cac vector rieng cua ma tran A*A' con duoc goi %la Eigenface do day la nhung vector rieng va no giong hinh khuon mat .

E = A* LeigV;

% E là một cơ sở gồm những vector trục giao, ta sẽ chuẩn hĩa nĩ để E biến thành một cơ sở trục chuẩn.

sovector=size(E,2); % số vector riêng trong E ( là số cột).

for i=1:sovector

dodai=norm(E(:,i)); E(:,i)=E(:,i)/dodai;

End

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Hàm này sẽ so sánh bức ảnh kiểm tra với từng bức ảnh trong csdl.

% Mỗi bức ảnh sẽ cĩ hình chiếu của nĩ lên một khơng gian khuơn mặt cĩ cơ số là E, ở đây ta sẽ khơng tìm những hình chiếu này mà tìm tọa độ của hình chiếu trong khơng gian khuơn mặt gọi tắt là tọa độ hình chiếu.

% Đầu tiên tính tọa độ hình chiếu của bức ảnh kiểm tra, sau đĩ tính tọa độ hình chiếu của tất cả bức ảnh trong csdl. Cuối cùng do khoảng cách giữa tọa độ hình chiếu của những bức ảnh trong csdl với tọa độ hình chiếu của ảnh kiểm tra. Bức ảnh trong csdl cĩ khoảng cách ngắn nhất với ảnh kiểm tra chình là bức ảnh tương ứng với bức ảnh kiểm tra.

% image là đường dẫn tới bức ảnh cần kiểm tra. % m là ảnh trung bình của các ảnh trong csdl.

% A là ma trận, mỗi cột là độ lệch giữa một ảnh trong csdl so với ảnh trung bình, cịn gọi là vector ảnh trung tâm.

%E là tập hợp những vector riêng của ma trận A*A’ % ảnh tìm là tên của bức ảnh tìm được trong csdl.

% tìm tọa độ chiều của mỗi vector cột trong A ( tương ứng với một bức ảnh) bằng cách nhân E’ với các vector cột này.

toado = [toado tam];

end

tam = rgb2gray(TestImage); % chuyển đổi ảnh RGB thành ảnh trắng đen. [dong cot] = size(tam);

InImage = reshape(tam',dong*cot,1); % thay đổi kích cỡ

% Tính độ lệch giữa ảnh kiểm tra và ảnh trung bình trong csdl, độ lệch là một vector cột giống như các vector cột trong ma trận A.

dolech = double(InImage)- m;

%Tương tự như khi tìm tọa độ hình chiếu của các vector cột của A, bây giờ ta tìm tọa độ hình chiếu của bức ảnh kiểm tra.

toadoKT = E'*dolech;

hinhchieuKT=double(InImage)*0;

for i=1:sovector

hinhchieuKT=hinhchieuKT + toadoKT(i,1)*E(:,i);

end

kc=norm(double(InImage)-hinhchieuKT); % chỉ tiêu ma trận hoặc vector str=num2str(kc); % đổi từ số thành chuỗi

str=strcat('Khoang cach tu anh kiem tra toi khong gian khuon mat : ',str); disp(str); % hiển thị ma trận hoặc văn bản.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Bây giờ ta sẽ tính khoảng cách giữa tọa độ hình chiếu của bức ảnh kiểm tra với tất cả tọa độ hình chiếu của các bức ảnh trong csdl. Tọa độ hình chiếu của ảnh kiểm tra sẽ cĩ khoảng cách ngắn nhất với hình chiếu của bức ảnh tương ứng trong csdl ( Hai bức ảnh cùng khuơn mặt của một người).

% Ta lưu ý là mọi tọa độ hình chiếu là một vector, ta sẽ dùng chuẩn Euclid để tính khoảng cách giữa 2 vector ( 2 tọa độ hình chiếu).

khoangcach = [];

for i = 1 : sovector

q = toado(:,i);

tam = ( norm( toadoKT - q ) )^2; khoangcach = [khoangcach tam];

end

% lấy ra khoảng cách ngắn nhất và vị trí của bức ảnh tìm được trong csdl, ta lưu ý là những file ảnh trong csdl cĩ tên là: 1.jpg, 2.jpg…

[minKC , vitri] = min(khoangcach);

if minKC < 15000000

str=num2str(minKC);

str=strcat('Min khoang cach hai toa do hinh chieu : ',str); disp(str);

anhtim1 = strcat(int2str(vitri),'.jpg'); anhtim = strcat(trainPath,'\',anhtim1); anhtim = imread(anhtim);

subplot(1,2,2) imshow(anhtim);

title('anh tim duoc trong co so du lieu');

str = strcat('ten buc anh tim duoc : ',anhtim1); disp(str)

fwrite(com,2,'int8'); fclose(com);

elseif minKC>15000000

str=num2str(minKC);

str=strcat('Min khoang cach hai toa do hinh chieu : ',str); disp(str); str=('khong co trong csdl'); subplot(1,2,2); a=imread('khongco.jpg'); imshow(a); title('khong co trong csdl'); disp(str) fwrite(com,254,'int8'); fclose(com); end subplot(1,2,1);

a=imread('E:\DO AN 2B\CODE CT\test\1.jpg'); imshow(a);

title('anh kiem tra');

% --- 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)

quit;

% --- Executes on button press in GIAO_TIEP.

function GIAO_TIEP_Callback(hObject, eventdata, handles)

% hObject handle to GIAO_TIEP (see GCBO)

if ketnoi==0 com = serial('COM1'); set(com,'baudrate',1200); com.DataBits =8; com.Parity = 'none'; com.StopBit = 1;

com.OutputBufferSize=512; % Kích thước đệm xuất 512 byte. com.InputBufferSize=512; % Kích thước đệm nhận 512 byte. com.BytesAvailableFcnCount = 1;% ấn định số byte định thu. com.Terminator = 'LF';% ký tự kết thúc là “ LF”.

com.ReadAsyncMode = 'continuous';% chế độ đọc liên tục

com.BytesAvailableFcnMode = 'Byte';% chọn Mode gây sự kiện là byte. fopen(com);% Mở cổng COM.

ketnoi=1; end

% --- Executes on button press in THOAT_GT.

function THOAT_GT_Callback(hObject, eventdata, handles)

% hObject handle to THOAT_GT (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

global com ketnoi; if ketnoi==1 ketnoi=0; fclose(com); delete (com); clear com; end

% --- Executes on button press in TU_DONG.

function TU_DONG_Callback(hObject, eventdata, handles)

% hObject handle to TU_DONG (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

global com ketnoi;

n1=0; while ketnoi==1 while com.BytesAvailable > n1; n1=com.BytesAvailable+1; vid=videoinput('winvideo',1); hinh=getsnapshot(vid);

imwrite(hinh, 'E:\DO AN 2B\CODE CT\test\1.jpg'); delete(vid);

a=imread('E:\DO AN 2B\CODE CT\test\1.jpg'); subplot(1,2,1);

imshow(a);pause(1)

TestImage=imread('E:\DO AN 2B\CODE CT\test\1.jpg'); trainPath='train'; csdl = dir(trainPath); soanh = 0; for i = 1:size(csdl,1) if not(strcmp(csdl(i).name,'.')|strcmp(csdl(i).name,'..')| strcmp(csdl(i).name,'Thumbs.db')) soanh = soanh + 1; end end T = []; for i = 1 : soanh

% Trong csdlcua vi du nay thi cac file anh co ten : 1.jpg , 2.jpg ...

str = int2str(i); str = strcat('\',str,'.jpg');

str = strcat(trainPath,str); % lay ten day du cua file anh img = imread(str);

img = rgb2gray(img); [dong cot] = size(img);

tam = reshape(img',dong*cot,1);% bien anh thanh vector T = [T tam]; % tang dan kich thuoc ma tran T

end

m = mean(T,2); soanh = size(T,2); A = [];

for i = 1 : soanh

temp = double(T(:,i)) - m;% T(:,i): vector cot thu i chinh la mot buc anh A = [A temp];

end

L = A'*A;[V D] = eig(L); [V D] = eig(L); D1=diag(D);

s=s(1);

D1=D1(s-14); LeigV = [];

for i = 1 : size(V,2)

if( D(i,i)>D1 )

LeigV = [LeigV V(:,i)]; end end E = A* LeigV; sovector=size(E,2); for i=1:sovector dodai=norm(E(:,i)); E(:,i)=E(:,i)/dodai; end toado = []; for i = 1 : sovector tam = E'*A(:,i); toado = [toado tam];

end

tam = rgb2gray(TestImage); [dong cot] = size(tam);

InImage = reshape(tam',dong*cot,1); dolech = double(InImage)- m; toadoKT = E'*dolech; hinhchieuKT=double(InImage)*0; for i=1:sovector hinhchieuKT=hinhchieuKT + toadoKT(i,1)*E(:,i); end kc=norm(double(InImage)-hinhchieuKT); str=num2str(kc);

str=strcat('Khoang cach tu anh kiem tra toi khong gian khuon mat : ',str); disp(str);

khoangcach = [];

for i = 1 : sovector

q = toado(:,i);

tam = ( norm( toadoKT - q ) )^2; khoangcach = [khoangcach tam];

end

[minKC , vitri] = min(khoangcach);

if minKC<15000000

str=num2str(minKC);

str=strcat('Min khoang cach hai toa do hinh chieu : ',str); disp(str); anhtim1 = strcat(int2str(vitri),'.jpg'); anhtim = strcat(trainPath,'\',anhtim1); anhtim = imread(anhtim); subplot(1,2,2) imshow(anhtim);

title('anh tim duoc trong co so du lieu');

str = strcat('ten buc anh tim duoc : ',anhtim1); disp(str) fwrite(com,2,'int8'); elseif minKC>15000000 str=('khong co trong csdl'); subplot(1,2,2); a=imread('khongco.jpg'); imshow(a); title('khong co trong csdl'); disp(str)

fwrite(com,254,'int8');% xuất dữ liệu ra cổng COM.

end

subplot(1,2,1);

a=imread('E:\DO AN 2B\CODE CT\test\1.jpg'); imshow(a);

title('anh kiem tra'); end

Một phần của tài liệu LUẬN VĂN ĐIỆN TỬ HỆ THỐNG BẢO MẬT (Trang 69 - 77)

Tải bản đầy đủ (DOC)

(78 trang)
w