Обнаружение и отслеживание лиц с помощью Live Video Acquisition

В этом примере показано, как автоматически обнаружить и отследить лицо в прямом видеопотоке, используя алгоритм KLT.

Обзор

Обнаружение объектов важны во многих приложениях компьютерного зрения, включая распознавание активности, безопасность автомобилей и наблюдение. В этом примере вы разработаете простую систему для отслеживания одной грани в прямом видеопотоке, захваченном веб-камерой. MATLAB обеспечивает поддержку веб-камеры через пакет аппаратной поддержки, который вам нужно будет загрузить и установить в порядок, чтобы запустить этот пример. Пакет поддержки доступен через программу установки пакета поддержки.

Система отслеживания лиц в этом примере может быть в одном из двух режимов: обнаружение или отслеживание. В режиме обнаружения можно использовать vision.CascadeObjectDetector объект для обнаружения грани в текущей системе координат. Если грань обнаружена, необходимо обнаружить угловые точки на грани, инициализировать vision.PointTracker объект, а затем переключиться в режим отслеживания.

В режиме отслеживания необходимо отслеживать точки с помощью точечного трекера. Когда вы отслеживаете точки, некоторые из них будут потеряны из-за окклюзии. Если число точек падает ниже порога, это означает, что лицо больше не отслеживается. Затем необходимо переключиться назад в режим обнаружения, чтобы попытаться повторно получить лицо.

Setup

Создайте объекты для обнаружения лиц, отслеживания точек, приобретения и отображения видеокадров.

% Create the face detector object.
faceDetector = vision.CascadeObjectDetector();

% Create the point tracker object.
pointTracker = vision.PointTracker('MaxBidirectionalError', 2);

% Create the webcam object.
cam = webcam();

% Capture one frame to get its size.
videoFrame = snapshot(cam);
frameSize = size(videoFrame);

% Create the video player object.
videoPlayer = vision.VideoPlayer('Position', [100 100 [frameSize(2), frameSize(1)]+30]);

Обнаружение и отслеживание

Захват и обработка видеокадров из веб-камеры в цикле для обнаружения и отслеживания лица. Цикл будет запускаться в течение 400 систем координат или до тех пор, пока окно видеоплеера не закроется.

runLoop = true;
numPts = 0;
frameCount = 0;

while runLoop && frameCount < 400

    % Get the next frame.
    videoFrame = snapshot(cam);
    videoFrameGray = rgb2gray(videoFrame);
    frameCount = frameCount + 1;

    if numPts < 10
        % Detection mode.
        bbox = faceDetector.step(videoFrameGray);

        if ~isempty(bbox)
            % Find corner points inside the detected region.
            points = detectMinEigenFeatures(videoFrameGray, 'ROI', bbox(1, :));

            % Re-initialize the point tracker.
            xyPoints = points.Location;
            numPts = size(xyPoints,1);
            release(pointTracker);
            initialize(pointTracker, xyPoints, videoFrameGray);

            % Save a copy of the points.
            oldPoints = xyPoints;

            % Convert the rectangle represented as [x, y, w, h] into an
            % M-by-2 matrix of [x,y] coordinates of the four corners. This
            % is needed to be able to transform the bounding box to display
            % the orientation of the face.
            bboxPoints = bbox2points(bbox(1, :));

            % Convert the box corners into the [x1 y1 x2 y2 x3 y3 x4 y4]
            % format required by insertShape.
            bboxPolygon = reshape(bboxPoints', 1, []);

            % Display a bounding box around the detected face.
            videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, 'LineWidth', 3);

            % Display detected corners.
            videoFrame = insertMarker(videoFrame, xyPoints, '+', 'Color', 'white');
        end

    else
        % Tracking mode.
        [xyPoints, isFound] = step(pointTracker, videoFrameGray);
        visiblePoints = xyPoints(isFound, :);
        oldInliers = oldPoints(isFound, :);

        numPts = size(visiblePoints, 1);

        if numPts >= 10
            % Estimate the geometric transformation between the old points
            % and the new points.
            [xform, inlierIdx] = estimateGeometricTransform2D(...
                oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
            oldInliers    = oldInliers(inlierIdx, :);
            visiblePoints = visiblePoints(inlierIdx, :);

            % Apply the transformation to the bounding box.
            bboxPoints = transformPointsForward(xform, bboxPoints);

            % Convert the box corners into the [x1 y1 x2 y2 x3 y3 x4 y4]
            % format required by insertShape.
            bboxPolygon = reshape(bboxPoints', 1, []);

            % Display a bounding box around the face being tracked.
            videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, 'LineWidth', 3);

            % Display tracked points.
            videoFrame = insertMarker(videoFrame, visiblePoints, '+', 'Color', 'white');

            % Reset the points.
            oldPoints = visiblePoints;
            setPoints(pointTracker, oldPoints);
        end

    end

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

    % Check whether the video player window has been closed.
    runLoop = isOpen(videoPlayer);
end

% Clean up.
clear cam;
release(videoPlayer);
release(pointTracker);
release(faceDetector);

Ссылки

Виола, Пол А. и Джонс, Майкл Дж. «Быстрое обнаружение объектов с использованием усиленного каскада простых функций», IEEE CVPR, 2001.

Брюс Д. Лукас и Такео Канаде. Итерационный метод регистрации изображений с приложением к видению стерео. Международная совместная конференция по искусственному интеллекту, 1981 год.

Карло Томази и Такео Канаде. Обнаружение и отслеживание функций точки. Технический доклад Университета Карнеги-Меллона CMU-CS-91-132, 1991 год.

Цзяньбо Ши и Карло Томази. Хорошие функции для отслеживания. IEEE Conference on Компьютерное Зрение and Pattern Recognition, 1994.

Зденек Калал, Крыстиан Миколайчик и Иржи Матас. Прямая-обратная ошибка: автоматическое обнаружение отказов отслеживания. Международная конференция по распознаванию шаблонов, 2010 год