├── .gitattributes ├── CreateDatabase.m ├── EigenfaceCore.m ├── Eigenfacetest.m ├── LICENSE ├── MAIN.fig ├── MAIN.m ├── README.md ├── Recognition.m ├── TestDatabase └── 1.jpg └── TrainDatabase └── 6.jpg /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /CreateDatabase.m: -------------------------------------------------------------------------------- 1 | function T = CreateDatabase(TrainDatabasePath) 2 | 3 | TrainFiles = dir(TrainDatabasePath); 4 | Train_Number = 0; 5 | 6 | for i = 1:size(TrainFiles,1) 7 | if not(strcmp(TrainFiles(i).name,'.')|strcmp(TrainFiles(i).name,'..')|strcmp(TrainFiles(i).name,'Thumbs.db')) 8 | Train_Number = Train_Number + 1; 9 | end 10 | end 11 | 12 | T = []; 13 | for i = 1 : Train_Number 14 | 15 | 16 | str = int2str(i); 17 | str = strcat(str,'.jpg'); 18 | str = strcat(TrainDatabasePath,str); 19 | 20 | img = imread(str); 21 | img = rgb2gray(img); 22 | 23 | [irow, icol] = size(img); 24 | 25 | temp = reshape(img',irow*icol,1); 26 | T = [T temp]; 27 | end -------------------------------------------------------------------------------- /EigenfaceCore.m: -------------------------------------------------------------------------------- 1 | function [m, A, Eigenfaces] = EigenfaceCore(T) 2 | 3 | 4 | 5 | m = mean(T,2); Train_Number = size(T,2); 6 | 7 | A = []; 8 | for i = 1 : Train_Number 9 | temp = double(T(:,i)) - m; A = [A temp]; 10 | end 11 | 12 | L = A'*A; 13 | [V ,D] = eig(L); 14 | 15 | L_eig_vec = []; 16 | for i = 1 : size(V,2) 17 | if( D(i,i)>1 ) 18 | L_eig_vec = [L_eig_vec V(:,i)]; 19 | end 20 | end 21 | 22 | Eigenfaces = A * L_eig_vec; -------------------------------------------------------------------------------- /Eigenfacetest.m: -------------------------------------------------------------------------------- 1 | function [m, A, Eigenfaces] = Eigenfacetest(T) 2 | m = mean(T,2); 3 | Train_Number = size(T,2); 4 | 5 | A = []; 6 | for i = 1 : Train_Number 7 | temp = double(T(:,i)) - m; 8 | A = [A temp]; 9 | end 10 | 11 | 12 | L = A'*A; 13 | [V ,D] = eig(L); 14 | 15 | L_eig_vec = []; 16 | for i = 1 : size(V,2) 17 | if( D(i,i)>1 ) 18 | L_eig_vec = [L_eig_vec V(:,i)]; 19 | end 20 | end 21 | 22 | 23 | Eigenfaces = A * L_eig_vec; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 ALOK KUMAR 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MAIN.fig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alokApps/FaceRecognitionSystem/868e31e1c3b3760bb728fec064a7639489ec3146/MAIN.fig -------------------------------------------------------------------------------- /MAIN.m: -------------------------------------------------------------------------------- 1 | function varargout = MAIN(varargin) 2 | gui_Singleton = 1; 3 | gui_State = struct('gui_Name', mfilename, ... 4 | 'gui_Singleton', gui_Singleton, ... 5 | 'gui_OpeningFcn', @MAIN_OpeningFcn, ... 6 | 'gui_OutputFcn', @MAIN_OutputFcn, ... 7 | 'gui_LayoutFcn', [] , ... 8 | 'gui_Callback', []); 9 | if nargin && ischar(varargin{1}) 10 | gui_State.gui_Callback = str2func(varargin{1}); 11 | end 12 | 13 | if nargout 14 | [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); 15 | else 16 | gui_mainfcn(gui_State, varargin{:}); 17 | end 18 | 19 | 20 | 21 | function MAIN_OpeningFcn(hObject, eventdata, handles, varargin) 22 | handles.output = hObject; 23 | guidata(hObject, handles); 24 | 25 | 26 | 27 | 28 | function varargout = MAIN_OutputFcn(hObject, eventdata, handles) 29 | 30 | varargout{1} = handles.output; 31 | 32 | 33 | function TEST_Callback(hObject, eventdata, handles) 34 | 35 | 36 | function ON_callback(hObject, eventdata, handles) 37 | mkdir('C:\Users\alok\Desktop\project\TestDatabase'); 38 | axes(handles.axes5); 39 | vid = videoinput('winvideo',1); 40 | handles.vid=vid; 41 | vidRes = get(vid, 'VideoResolution'); 42 | nBands = get(vid, 'NumberOfBands'); 43 | hImage = image( zeros(vidRes(2), vidRes(1), nBands) ); 44 | preview(vid,hImage); 45 | img = getsnapshot(vid); 46 | axes(handles.axes6); 47 | imshow(img); 48 | guidata(hObject,handles); 49 | FDetect=vision.CascadeObjectDetector('Nose'); 50 | BB=step(FDetect,img); 51 | axes(handles.axes7); 52 | imshow(img); 53 | hold on 54 | for i=1:size(BB,1) 55 | rectangle('position',BB(i,:),'Linewidth',5,'Linestyle','-','Edgecolor','r'); 56 | end 57 | hold off 58 | N=size(BB,1); 59 | handles.N=N; 60 | counter=1; 61 | for i=1:N 62 | face=imcrop(img,BB(i,:)); 63 | savenam = strcat('C:\Users\alok\Desktop\project\TestDatabase\' ,num2str(counter), '.jpg'); 64 | baseDir = 'C:\Users\alok\Desktop\project\TestDatabase\'; 65 | 66 | newName = [baseDir num2str(counter) '.jpg']; 67 | handles.face=face; 68 | while exist(newName,'file') 69 | counter = counter + 1; 70 | newName = [baseDir num2str(counter) '.jpg']; 71 | end 72 | fac=imresize(face,[240,320]); 73 | imwrite(fac,newName); 74 | axes(eval(['handles.axes', num2str(i)])); 75 | imshow(face); 76 | guidata(hObject,handles); 77 | pause(5); 78 | end 79 | 80 | 81 | function CameraOff_Callback(hObject, eventdata, handles) 82 | off=handles.vid; 83 | delete(off); 84 | 85 | function EXIT_Callback(hObject, eventdata, handles) 86 | close; 87 | 88 | 89 | function Test_Callback(hObject, eventdata, handles) 90 | rec=handles.N; 91 | TrainDatabasePath = 'C:\Users\alok\Desktop\project\TrainDatabase\'; 92 | TestDatabasePath = 'C:\Users\alok\Desktop\project\TestDatabase\'; 93 | v=rec; 94 | for j = 1:v 95 | TestImage = num2str(j); 96 | s=strcat('a',TestImage); 97 | TestImage = strcat(TestDatabasePath,'\',char( TestImage),'.jpg'); 98 | T = CreateDatabase(TrainDatabasePath); 99 | [m, A, Eigenfaces] = EigenfaceCore(T); 100 | OutputName = Recognition(TestImage, m, A, Eigenfaces); 101 | SelectedImage = strcat(TrainDatabasePath,'\', OutputName); 102 | SelectedImage = imread(SelectedImage); 103 | axes(eval(['handles.axes', num2str(s)])); 104 | imshow(SelectedImage); 105 | end 106 | 107 | function ADDPHOTO_Callback(hObject, eventdata, handles) 108 | function ADD_Callback(hObject, eventdata, handles) 109 | 110 | for ind=1:3 111 | axes(handles.axes5); 112 | vid = videoinput('winvideo',1); 113 | handles.vid=vid; 114 | vidRes = get(vid, 'VideoResolution'); 115 | nBands = get(vid, 'NumberOfBands'); 116 | hImage = image( zeros(vidRes(2), vidRes(1), nBands) ); 117 | preview(vid,hImage); 118 | img = getsnapshot(vid); 119 | axes(handles.axes6); 120 | imshow(img); 121 | guidata(hObject,handles); 122 | FDetect=vision.CascadeObjectDetector('FrontalFaceCART'); 123 | htextinsface = vision.TextInserter('Text', 'face : %2d', 'Location', [5 2],'Font', 'Courier New','FontSize', 14); 124 | BB=step(FDetect,img); 125 | axes(handles.axes7); 126 | imshow(img); 127 | hold on 128 | for i=1:size(BB,1) 129 | rectangle('position',BB(i,:),'Linewidth',5,'Linestyle','-','Edgecolor','r'); 130 | end 131 | hold off 132 | N=size(BB,1); 133 | handles.N=N; 134 | counter=1; 135 | for i=1:N 136 | face=imcrop(img,BB(i,:)); 137 | savenam = strcat('C:\Users\alok\Desktop\project\TrainDatabase\' ,num2str(counter), '.jpg'); 138 | baseDir = 'C:\Users\alok\Desktop\project\TrainDatabase\'; 139 | % baseName = 'image_'; 140 | newName = [baseDir num2str(counter) '.jpg']; 141 | handles.face=face; 142 | while exist(newName,'file') 143 | counter = counter + 1; 144 | newName = [baseDir num2str(counter) '.jpg']; 145 | end 146 | fac=imresize(face,[240,320]); 147 | imwrite(fac,newName); 148 | 149 | axes(eval(['handles.axes', num2str(i)])); 150 | imshow(face); 151 | guidata(hObject,handles); 152 | pause(2); 153 | end 154 | delete(vid); 155 | end 156 | 157 | 158 | % -------------------------------------------------------------------- 159 | function DetectByFace_Callback(hObject, eventdata, handles) 160 | % hObject handle to DetectByFace (see GCBO) 161 | % eventdata reserved - to be defined in a future version of MATLAB 162 | % handles structure with handles and user data (see GUIDATA) 163 | mkdir('C:\Users\alok\Desktop\project\TestDatabase'); 164 | axes(handles.axes5); 165 | vid = videoinput('winvideo',1); 166 | handles.vid=vid; 167 | vidRes = get(vid, 'VideoResolution'); 168 | nBands = get(vid, 'NumberOfBands'); 169 | hImage = image( zeros(vidRes(2), vidRes(1), nBands) ); 170 | preview(vid,hImage); 171 | img = getsnapshot(vid); 172 | axes(handles.axes6); 173 | imshow(img); 174 | guidata(hObject,handles); 175 | FDetect=vision.CascadeObjectDetector('FrontalFaceLBP'); 176 | BB=step(FDetect,img); 177 | axes(handles.axes7); 178 | imshow(img); 179 | hold on 180 | for i=1:size(BB,1) 181 | rectangle('position',BB(i,:),'Linewidth',5,'Linestyle','-','Edgecolor','r'); 182 | end 183 | hold off 184 | N=size(BB,1); 185 | handles.N=N; 186 | counter=1; 187 | for i=1:N 188 | face=imcrop(img,BB(i,:)); 189 | savenam = strcat('C:\Users\alok\Desktop\project\TestDatabase\' ,num2str(counter), '.jpg'); 190 | baseDir = 'C:\Users\alok\Desktop\project\TestDatabase\'; 191 | 192 | newName = [baseDir num2str(counter) '.jpg']; 193 | handles.face=face; 194 | while exist(newName,'file') 195 | counter = counter + 1; 196 | newName = [baseDir num2str(counter) '.jpg']; 197 | end 198 | fac=imresize(face,[240,320]); 199 | imwrite(fac,newName); 200 | axes(eval(['handles.axes', num2str(i)])); 201 | imshow(face); 202 | guidata(hObject,handles); 203 | pause(5); 204 | end 205 | 206 | 207 | % -------------------------------------------------------------------- 208 | function DetectByNose_Callback(hObject, eventdata, handles) 209 | % hObject handle to DetectByNose (see GCBO) 210 | % eventdata reserved - to be defined in a future version of MATLAB 211 | % handles structure with handles and user data (see GUIDATA) 212 | mkdir('C:\Users\alok\Desktop\project\TestDatabase'); 213 | axes(handles.axes5); 214 | vid = videoinput('winvideo',1); 215 | handles.vid=vid; 216 | vidRes = get(vid, 'VideoResolution'); 217 | nBands = get(vid, 'NumberOfBands'); 218 | hImage = image( zeros(vidRes(2), vidRes(1), nBands) ); 219 | preview(vid,hImage); 220 | img = getsnapshot(vid); 221 | axes(handles.axes6); 222 | imshow(img); 223 | guidata(hObject,handles); 224 | FDetect=vision.CascadeObjectDetector('Nose'); 225 | BB=step(FDetect,img); 226 | axes(handles.axes7); 227 | imshow(img); 228 | hold on 229 | for i=1:size(BB,1) 230 | rectangle('position',BB(i,:),'Linewidth',5,'Linestyle','-','Edgecolor','r'); 231 | end 232 | hold off 233 | N=size(BB,1); 234 | handles.N=N; 235 | counter=1; 236 | for i=1:N 237 | face=imcrop(img,BB(i,:)); 238 | savenam = strcat('C:\Users\alok\Desktop\project\TestDatabase\' ,num2str(counter), '.jpg'); 239 | baseDir = 'C:\Users\alok\Desktop\project\TestDatabase\'; 240 | 241 | newName = [baseDir num2str(counter) '.jpg']; 242 | handles.face=face; 243 | while exist(newName,'file') 244 | counter = counter + 1; 245 | newName = [baseDir num2str(counter) '.jpg']; 246 | end 247 | fac=imresize(face,[240,320]); 248 | imwrite(fac,newName); 249 | axes(eval(['handles.axes', num2str(i)])); 250 | imshow(face); 251 | guidata(hObject,handles); 252 | pause(5); 253 | end 254 | 255 | 256 | 257 | % -------------------------------------------------------------------- 258 | function DetectByEyes_Callback(hObject, eventdata, handles) 259 | % hObject handle to DetectByEyes (see GCBO) 260 | % eventdata reserved - to be defined in a future version of MATLAB 261 | % handles structure with handles and user data (see GUIDATA) 262 | mkdir('C:\Users\alok\Desktop\project\TestDatabase'); 263 | axes(handles.axes5); 264 | vid = videoinput('winvideo',1); 265 | handles.vid=vid; 266 | vidRes = get(vid, 'VideoResolution'); 267 | nBands = get(vid, 'NumberOfBands'); 268 | hImage = image( zeros(vidRes(2), vidRes(1), nBands) ); 269 | preview(vid,hImage); 270 | img = getsnapshot(vid); 271 | axes(handles.axes6); 272 | imshow(img); 273 | guidata(hObject,handles); 274 | FDetect=vision.CascadeObjectDetector('EyePairSmall'); 275 | BB=step(FDetect,img); 276 | axes(handles.axes7); 277 | imshow(img); 278 | hold on 279 | for i=1:size(BB,1) 280 | rectangle('position',BB(i,:),'Linewidth',5,'Linestyle','-','Edgecolor','r'); 281 | end 282 | hold off 283 | N=size(BB,1); 284 | handles.N=N; 285 | counter=1; 286 | for i=1:N 287 | face=imcrop(img,BB(i,:)); 288 | savenam = strcat('C:\Users\alok\Desktop\project\TestDatabase\' ,num2str(counter), '.jpg'); 289 | baseDir = 'C:\Users\alok\Desktop\project\TestDatabase\'; 290 | 291 | newName = [baseDir num2str(counter) '.jpg']; 292 | handles.face=face; 293 | while exist(newName,'file') 294 | counter = counter + 1; 295 | newName = [baseDir num2str(counter) '.jpg']; 296 | end 297 | fac=imresize(face,[240,320]); 298 | imwrite(fac,newName); 299 | axes(eval(['handles.axes', num2str(i)])); 300 | imshow(face); 301 | guidata(hObject,handles); 302 | pause(5); 303 | end 304 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FaceRecognitionSystem 2 | This system can match human face over a webcam against the pictures stored in a database, primarily by matching facial features such as face, nose and eyes. 3 | 4 | -------------------------------------------------------------------------------- /Recognition.m: -------------------------------------------------------------------------------- 1 | function OutputName = Recognition(TestImage, m, A, Eigenfaces) 2 | 3 | 4 | ProjectedImages = []; 5 | Train_Number = size(Eigenfaces,2); 6 | for i = 1 : Train_Number 7 | temp = Eigenfaces'*A(:,i); 8 | ProjectedImages = [ProjectedImages temp]; 9 | end 10 | 11 | InputImage = imread(TestImage); 12 | temp = InputImage(:,:,1); 13 | 14 | [irow, icol] = size(temp); 15 | InImage = reshape(temp',irow*icol,1); 16 | Difference = double(InImage)-m; 17 | ProjectedTestImage = Eigenfaces'*Difference; 18 | Euc_dist = []; 19 | for i = 1 : Train_Number 20 | q = ProjectedImages(:,i); 21 | temp = ( norm( ProjectedTestImage - q ) )^2; 22 | Euc_dist = [Euc_dist temp]; 23 | end 24 | 25 | [Euc_dist_min , Recognized_index] = min(Euc_dist); 26 | OutputName = strcat(int2str(Recognized_index),'.jpg'); 27 | -------------------------------------------------------------------------------- /TestDatabase/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alokApps/FaceRecognitionSystem/868e31e1c3b3760bb728fec064a7639489ec3146/TestDatabase/1.jpg -------------------------------------------------------------------------------- /TrainDatabase/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alokApps/FaceRecognitionSystem/868e31e1c3b3760bb728fec064a7639489ec3146/TrainDatabase/6.jpg --------------------------------------------------------------------------------