2015-05-03 5 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.