Обнаружение лиц в реальном времени в MATLAB

Я пытаюсь сделать детектор лица в реальном времени с помощью MATLAB. Я нашел пример кода на странице Mathworks, но он использует пример видео. У меня проблема с тем, что этот код может отслеживать только тот, который он выбирает, даже с несколькими лицами в начальном кадре. Мне нужно, чтобы отслеживать несколько лиц одновременно. Возможно ли это с изменением этого кода, которое не является радикальным. Я нашел следующий код на веб-странице MathWorks:

% Create a cascade detector object.
faceDetector = vision.CascadeObjectDetector();

% Read a video frame and run the detector.
videoFileReader = vision.VideoFileReader('visionface.avi');
videoFrame      = step(videoFileReader);
bbox            = step(faceDetector, videoFrame);

% Draw the returned bounding box around the detected face.
videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');
figure, imshow(videoOut), title('Detected face');

% Get the skin tone information by extracting the Hue from the video frame
% converted to the HSV color space.
[hueChannel,~,~] = rgb2hsv(videoFrame);

% Display the Hue Channel data and draw the bounding box around the face.
figure, imshow(hueChannel), title('Hue channel data');
rectangle('Position',bbox(1,:),'LineWidth',2,'EdgeColor',[1 1 0])

% Detect the nose within the face region. The nose provides a more accurate
% measure of the skin tone because it does not contain any background
% pixels.
noseDetector = vision.CascadeObjectDetector('Nose');
faceImage    = imcrop(videoFrame,bbox(1,:));
noseBBox     = step(noseDetector,faceImage);

% The nose bounding box is defined relative to the cropped face image.
% Adjust the nose bounding box so that it is relative to the original video
% frame.
noseBBox(1,1:2) = noseBBox(1,1:2) + bbox(1,1:2);

% Create a tracker object.
tracker = vision.HistogramBasedTracker;

% Initialize the tracker histogram using the Hue channel pixels from the
% nose.
initializeObject(tracker, hueChannel, noseBBox(1,:));

% Create a video player object for displaying video frames.
videoInfo    = info(videoFileReader);
videoPlayer  = vision.VideoPlayer('Position',[300 300 videoInfo.VideoSize+30]);

% Track the face over successive video frames until the video is finished.
while ~isDone(videoFileReader)

% Extract the next video frame
videoFrame = step(videoFileReader);

% RGB -> HSV
[hueChannel,~,~] = rgb2hsv(videoFrame);

% Track using the Hue channel data
bbox = step(tracker, hueChannel);

% Insert a bounding box around the object being tracked
videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');

% Display the annotated video frame using the video player object
step(videoPlayer, videoOut);

end

% Release resources
release(videoFileReader);
release(videoPlayer);

Заранее спасибо!


person Martin V    schedule 20.10.2013    source источник


Ответы (1)


Этот пример предназначен для отслеживания только одного лица. Для отслеживания нескольких объектов взгляните на этот пример, который использует vision.KalmanFilter объектов для отслеживания. Вы можете заменить часть обнаружения в этом примере кодом для обнаружения лиц.

В качестве альтернативы взгляните на этот пример использования алгоритма KLT (vision.PointTracker) для отслеживания точек. Вы также можете изменить это, чтобы отслеживать несколько лиц, но это значительно больше работы. Вам придется вести большую бухгалтерию, чтобы отслеживать, какие точки принадлежат каким граням.

Изменить: вот пример о том, как использовать vision.PointTracker для отслеживания нескольких лиц.

person Dima    schedule 23.10.2013