Столкнитесь с обнаружением и отслеживающий Используя алгоритм KLT

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

Введение

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

  1. Обнаружьте поверхность

  2. Идентифицируйте черты лица, чтобы отследить

  3. Отследите поверхность

Обнаружьте поверхность

Во-первых, необходимо обнаружить поверхность. Используйте vision.CascadeObjectDetector объект обнаружить местоположение поверхности в видеокадре. Каскадный детектор объектов использует алгоритм обнаружения Виолы - Джонса и обученную модель классификации для обнаружения. По умолчанию детектор сконфигурирован, чтобы обнаружить поверхности, но он может использоваться, чтобы обнаружить другие типы объектов.

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

% Read a video frame and run the face detector.
videoReader = VideoReader('tilted_face.avi');
videoFrame      = readFrame(videoReader);
bbox            = step(faceDetector, videoFrame);

% Draw the returned bounding box around the detected face.
videoFrame = insertShape(videoFrame, 'Rectangle', bbox);
figure; imshow(videoFrame); title('Detected face');

Figure contains an axes object. The axes object with title Detected face contains an object of type image.

% Convert the first box into a list of 4 points
% This is needed to be able to visualize the rotation of the object.
bboxPoints = bbox2points(bbox(1, :));

Чтобы отслеживать поверхность в зависимости от времени, этот пример использует алгоритм Kanade-Lucas-Tomasi (KLT). В то время как возможно использовать каскадный детектор объектов на каждой системе координат, это в вычислительном отношении дорого. Это также может не обнаружить поверхность, когда предмет поворачивает или наклоняет его голову. Это ограничение прибывает из типа обученной модели классификации, используемой для обнаружения. Пример обнаруживает поверхность только однажды, и затем алгоритм KLT отслеживает поверхность через видеокадры.

Идентифицируйте черты лица, чтобы отследить

Алгоритм KLT отслеживает набор характерных точек через видеокадры. Если обнаружение определяет местоположение поверхности, следующий шаг в примере идентифицирует характерные точки, которые могут быть надежно прослежены. Этот пример использует стандарт, "хорошие функции, чтобы отследить" предложенный Ши и Томэзи.

Обнаружьте характерные точки в области поверхности.

points = detectMinEigenFeatures(rgb2gray(videoFrame), 'ROI', bbox);

% Display the detected points.
figure, imshow(videoFrame), hold on, title('Detected features');
plot(points);

Figure contains an axes object. The axes object with title Detected features contains 2 objects of type image, line.

Инициализируйте средство отслеживания, чтобы отследить точки

С идентифицированными характерными точками можно теперь использовать vision.PointTracker Системный объект, чтобы отследить их. Для каждой точки в предыдущей системе координат средство отслеживания точки пытается найти соответствующую точку в текущей системе координат. Затем estimateGeometricTransform2D функция используется, чтобы оценить перевод, вращение и шкалу между старыми точками и новыми точками. Это преобразование применяется к ограничительной рамке вокруг поверхности.

Создайте средство отслеживания точки и позвольте двунаправленному ошибочному ограничению сделать его более устойчивым в присутствии шума и помехи.

pointTracker = vision.PointTracker('MaxBidirectionalError', 2);

% Initialize the tracker with the initial point locations and the initial
% video frame.
points = points.Location;
initialize(pointTracker, points, videoFrame);

Инициализируйте видеоплеер, чтобы отобразить результаты

Создайте объект видеоплеера для отображения видеокадров.

videoPlayer  = vision.VideoPlayer('Position',...
    [100 100 [size(videoFrame, 2), size(videoFrame, 1)]+30]);

Отследите поверхность

Отследите точки от системы координат до системы координат и используйте estimateGeometricTransform2D функционируйте, чтобы оценить движение поверхности.

Сделайте копию точек, чтобы быть используемыми в вычислениях геометрическое преобразование между точками в предыдущем и текущих системах координат

oldPoints = points;

while hasFrame(videoReader)
    % get the next frame
    videoFrame = readFrame(videoReader);

    % Track the points. Note that some points may be lost.
    [points, isFound] = step(pointTracker, videoFrame);
    visiblePoints = points(isFound, :);
    oldInliers = oldPoints(isFound, :);
    
    if size(visiblePoints, 1) >= 2 % need at least 2 points
        
        % Estimate the geometric transformation between the old points
        % and the new points and eliminate outliers
        [xform, inlierIdx] = estimateGeometricTransform2D(...
            oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
        oldInliers    = oldInliers(inlierIdx, :);
        visiblePoints = visiblePoints(inlierIdx, :);
        
        % Apply the transformation to the bounding box points
        bboxPoints = transformPointsForward(xform, bboxPoints);
                
        % Insert a bounding box around the object being tracked
        bboxPolygon = reshape(bboxPoints', 1, []);
        videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, ...
            'LineWidth', 2);
                
        % Display tracked points
        videoFrame = insertMarker(videoFrame, visiblePoints, '+', ...
            'Color', 'white');       
        
        % Reset the points
        oldPoints = visiblePoints;
        setPoints(pointTracker, oldPoints);        
    end
    
    % Display the annotated video frame using the video player object
    step(videoPlayer, videoFrame);
end

% Clean up
release(videoPlayer);

Figure Video Player contains an axes object and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes object contains an object of type image.

release(pointTracker);

Сводные данные

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

Ссылки

Виола, Пол А. и Джонс, Майкл Дж. "Быстрое Обнаружение объектов с помощью Повышенного Каскада Простых Функций", IEEE CVPR, 2001.

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

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

Цзяньбо Ши и Карло Томази. Хорошие функции, чтобы отследить. Конференция по IEEE по компьютерному зрению и распознаванию образов, 1994.

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