2015-05-03 36 views
-2

我有一个实时皮肤检测算法,它给了我一个矩形('Position',bb,'EdgeColor','r','LineWidth ',2)从原始图像。在使用Viola Jones从裁剪的皮肤区域检测脸部区域之前,我希望使用代码首先检测原始图像中的皮肤区域。我希望知道在裁剪出皮肤区域后,使用人脸检测算法检测人脸,如何将人脸边界框映射到原始图像。将边界框映射到Matlab中的原始图像

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

这是我无法将边界框放回原始图像的地方。

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

我想把我从人脸检测器获得的矩形放到原始位置的图像中裁剪图像的原始位置。

回答

0

只需将裁剪区域的左上角坐标添加到检测到的边界框的左上角。

另外,在MATLAB的最新版本中,vision.CascadeObjectDetector支持在感兴趣的区域传递想要检测物体的区域,这样就不需要裁剪。然后它会调整你的坐标。检查step()方法vision.CascadeObjectDetector的文档。