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

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

Введение

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

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

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

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

Шаг 1: обнаружьте поверхность, чтобы отследить

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

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

Можно использовать каскадный объектный детектор, чтобы отследить поверхность через последовательные кадры видео. Однако, когда наклоны поверхности или человек поворачивают голову, можно потерять отслеживание. Это ограничение происходит из-за типа обученной модели классификации, используемой для обнаружения. Чтобы избежать этой проблемы, и потому что выполнение обнаружения поверхности для каждого кадра видео в вычислительном отношении интенсивно, этот пример использует простую черту лица для отслеживания.

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

Если поверхность расположена в видео, следующий шаг должен идентифицировать функцию, которая поможет вам отследить поверхность. Например, можно использовать форму, структуру или цвет. Выберите функцию, которая уникальна для объекта и остается инвариантной, даже когда объект перемещается.

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

Получите информацию скинтона путем извлечения Оттенка от кадра видео, преобразованного в цветовое пространство HSV.

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

Шаг 3: отследите поверхность

Со скинтоном, выбранным как функция, чтобы отследить, можно теперь использовать vision.HistogramBasedTracker для отслеживания. Основанное на гистограмме средство отслеживания использует алгоритм CAMShift, который предусматривает возможность отследить объект с помощью гистограммы пиксельных значений. В этом примере пиксели канала Оттенка извлечены из области носа обнаруженной поверхности. Эти пиксели используются, чтобы инициализировать гистограмму для средства отслеживания. Пример отслеживает объект по последовательным кадрам видео с помощью этой гистограммы.

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

noseDetector = vision.CascadeObjectDetector('Nose', 'UseROI', true);
noseBBox     = step(noseDetector, videoFrame, bbox(1,:));

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

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

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

Ссылка

[1] Г.Р. Брадский "Оперативная поверхность и объект, отслеживающий как компонент перцепционного пользовательского интерфейса", продолжения 4-го семинара IEEE по приложениям компьютерного зрения, 1998.

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