-2

i have a real time skin detection algorithm where it gives me a bounding box around the skin region with rectangle('Position',bb,'EdgeColor','r','LineWidth',2) from an original image. I wish to use the code to first detect the skin region from the original image before i use Viola Jones to detect the face region from the cropped skin region. I wish to know after i crop the skin region then use the face detection algorithm to detect the face, how can i map the bounding box of the face to the original image.

function cameraon_Callback(hObject, eventdata, handles)
% hObject    handle to cameraon (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global video;
global videoFrame;
axes(handles.axes1);
video = videoinput('winvideo',1,'YUY2_320x240');
set(video,'ReturnedColorSpace','rgb');
handles.video=video;
triggerconfig(video,'manual');
video.FramesPerTrigger = 1;
guidata(hObject,handles);
faceDetector=vision.CascadeObjectDetector('FrontalFaceCART');
faceDetector.MinSize=[20 20];
faceDetector.MergeThreshold = 20;
videoFrame=getsnapshot(video);
bbox=step(faceDetector,videoFrame);
 if numel(bbox) == 0
    errordlg('Face not detected. Please try again.');
    set(handles.cameraon,'String','Start Camera')
    stop(video);
    delete(video);
    clear;
else
     axes(handles.axes1);
     start(video);
end
while(true)
    frame=getsnapshot(video);
%Detect faces.
data = frame;% this is to read a image from data base. just put any image name u want to give make sure its placed in bin
diff_im = imsubtract(data(:,:,1), rgb2gray(data)); % deleting gray scale pixels from image
diff_im = medfilt2(diff_im, [3 3]); %applying filter one 
diff_im = imadjust(diff_im); % adjust image function to fill small holes (check all the function's functionality to have idea of whats going on)
level = graythresh(diff_im);% extract level value
bw = im2bw(diff_im,level);
BW5 = imfill(bw,'holes');
bw6 = bwlabel(BW5, 8);
stats = regionprops(bw6,['basic']);%basic mohem nist
measurements = regionprops(bw6, 'boundingbox');
BB1=struct2cell(measurements);
BB2=cell2mat(BB1);
a = BB2(1);
b = BB2(2);
c = BB2(3);
d = BB2(4);
[N,M]=size(stats);
if (bw==0)% check if there is no skin color then exit
        break;
else
     tmp = stats(1);
for i = 2 : N % checking for biggest hole to mark it as face 
      if stats(i).Area > tmp.Area
        tmp = stats(i);
      end
 end
bb = tmp.BoundingBox; % applying identification square to mark skin color region
bc = tmp.Centroid;
   videoFrame=getsnapshot(video);

This is the place where i cannot put the bounding box back to the original image.

   skinImage    = imcrop(videoFrame,bb(1,:));
    bbox = step(faceDetector,skinImage);
  bbox(1,1:2) = bbox(1,1:2) + bb(1,1:2);
      videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face'); 
    cla;
    imshow(videoOut,[]);
    drawnow;
    pause(0.0001);
  end
  end
  guidata(hObject,handles);

I want to put the rectangle i got from the face detector onto the full size image at the original location in the image where the cropped image come from.

Dima
  • 38,860
  • 14
  • 75
  • 115
chonglim
  • 33
  • 5

1 Answers1

0

You simply add the coordinates of the top-left corner of the cropped region to the top-left corners of the detected bounding boxes.

Also, in the latest version of MATLAB vision.CascadeObjectDetector supports passing in the region of interest where you want to detect objects, so that you do not need to crop. Then it will adjust the coordinates for you. Check the documentation for the step() method of vision.CascadeObjectDetector.

Dima
  • 38,860
  • 14
  • 75
  • 115