在Matlab中将边界框映射到原始图像

时间:2015-05-03 08:50:23

标签: matlab matlab-cvst bounding-box

我有一个实时皮肤检测算法,它给我一个带有矩形的皮肤区域周围的边界框('位置',bb,' EdgeColor'' r& #39;,' LineWidth',2)来自原始图片。在使用Viola Jones从裁剪的皮肤区域检测面部区域之前,我希望使用该代码首先从原始图像中检测皮肤区域。我想知道在裁剪完皮肤区域然后使用面部检测算法来检测面部,我该如何将面部的边界框映射到原始图像。

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

我想将从面部检测器获得的矩形放在图像中原始位置的全尺寸图像上,图像来自裁剪后的图像。

1 个答案:

答案 0 :(得分:0)

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

此外,在最新版本的MATLAB vision.CascadeObjectDetector支持传入您想要检测对象的感兴趣区域,这样您就不需要裁剪。然后它会为你调整坐标。请查看step() vision.CascadeObjectDetector方法的文档。