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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

oldPoints = points;

while ~isDone(videoFileReader)
    % get the next frame
    videoFrame = step(videoFileReader);

    % 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, oldInliers, visiblePoints] = estimateGeometricTransform(...
            oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
        
        % 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(videoFileReader);
release(videoPlayer);

release(pointTracker);

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

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

Ссылки

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

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

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

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

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