Столкнитесь с обнаружением и отслеживающий Используя алгоритм 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');

% 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 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, 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(videoPlayer);

release(pointTracker);

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

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

Ссылки

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

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

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

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

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