% Given the original color image and the segmented image, displays a new image
% with rectangles indicating the face regions found.

function [imsource] = detect(imagecolor, imagesegmented)

clear

% Coordinates of possible faces are empty.
FaceCoord = [];

% ******** Read the template face image *********
frontalmodel = imread('frontal.tif');

% ********* Read the Source Images ************

% Read the source image in grayscale
imsource = imread(imagecolor);

% Get the skin color segmented image (black and white)
skincolor = imread(imagesegmented);
BW = im2bw(skincolor);


% **********************************

% Change the original image to gray scale.
imsourcegray = rgb2gray(imsource);
imshow(imsourcegray);

% Get the number of regions in the color skin segmented image

[L,numobj] = bwlabel(BW,8);

map = [0 0 0; jet(numobj)];
figure;
imshow(L+1, map,'notruesize');


 % Iterate through the number of objects (or regions) found in the
 % image.
 
for i=1:numobj,
     
   % Compute the coordinates for this region.
   [x,y] = find(bwlabel(BW) == i);
  
   % Get an image that only has this region, the rest is black
   bwsegment = bwselect(BW,y,x,8);
  
   % Compute the number of segments inside this region
   [L,numobjs] = bwlabel(bwsegment,4);
    
   % Get the number of holes.
   numfeatures = bweuler(bwsegment,4);
   numholes = 1 - numfeatures;
   
   % For now, a possible face needs to have more than one hole.
   % otherwise, it is discarded.
   
   if (numholes >= 1)
      
      % Get the rectangle coordinates if it is a region tha indicatesa
      % a face. 
      [RectCoord,imsourcegray] = processregion(imsourcegray,bwsegment,numholes,frontalmodel);
     
      % if the region is a facem add to a vector of face coordinates
      if (RectCoord ~= -1)
         FaceCoord = [FaceCoord; RectCoord];
      end;
   end;

end % for  


% ********************************************
%                 Final Output
% ********************************************

 % Display the original image with the region that is a face 
 figure;
 imshow(imsource);
 % display the rectangle(s) if we found face(s) in the image
 [numfaces x] = size(FaceCoord);
 for i=1:numfaces,
   hd = rectangle('Position',FaceCoord(i,:));
   set(hd, 'edgecolor', 'w');
 end;
 
  
