В этом примере показано, как автоматически обнаруживать и отслеживать грань.
Обнаружение и отслеживание объектов важны во многих приложениях компьютерного зрения, включая распознавание активности, автомобильную безопасность и наблюдение. В этом примере будет разработана простая система отслеживания лиц путем разделения задачи отслеживания на три отдельные задачи:
Обнаружение грани для отслеживания
Определение элементов лица для отслеживания
Отслеживать лицо
Прежде чем начать отслеживать лицо, необходимо сначала обнаружить его. Используйте vision.CascadeObjectDetector для определения местоположения грани в видеокадре. Каскадный детектор объектов использует алгоритм обнаружения Виолы-Джонса и обученную классификационную модель для обнаружения. По умолчанию детектор настроен на обнаружение граней, но может быть настроен для других типов объектов.
% Create a cascade detector object. faceDetector = vision.CascadeObjectDetector(); % Read a video frame and run the detector. videoFileReader = VideoReader('visionface.avi'); videoFrame = readFrame(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');
![]()
Можно использовать каскадный детектор объектов для отслеживания лица на последовательных видеокадрах. Однако, когда лицо наклоняется или человек поворачивается головой, вы можете потерять слежение. Это ограничение связано с типом обученной модели классификации, используемой для обнаружения. Чтобы избежать этой проблемы, и поскольку выполнение обнаружения лица для каждого видеокадра является вычислительно интенсивным, в этом примере используется простая функция лица для отслеживания.
После того как лицо будет расположено в видеоролике, следующим шагом будет определение функции, которая поможет отслеживать лицо. Например, можно использовать форму, текстуру или цвет. Выберите элемент, который является уникальным для объекта и остается инвариантным даже при перемещении объекта.
В этом примере для отслеживания используется тон темы оформления. Тон кожи обеспечивает большой контраст между лицом и фоном и не изменяется при вращении или движении лица.
Получение информации о тоне кожи путем извлечения тона из видеокадра, преобразованного в цветовое пространство 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])
![]()
После выбора тона темы оформления в качестве функции для отслеживания теперь можно использовать vision.HistogramBasedTracker для отслеживания. Трекер на основе гистограммы использует алгоритм CAMShift, который обеспечивает возможность отслеживания объекта с использованием гистограммы значений пикселей. В этом примере пиксели канала Hue извлекаются из области носа обнаруженной грани. Эти пиксели используются для инициализации гистограммы для трекера. Пример отслеживает объект по последовательным видеокадрам с использованием этой гистограммы.
Обнаружить нос в области лица. Нос обеспечивает более точное измерение тона кожи, поскольку он не содержит фоновых пикселей.
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. videoPlayer = vision.VideoPlayer; % Track the face over successive video frames until the video is finished. while hasFrame(videoFileReader) % Extract the next video frame videoFrame = readFrame(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(videoPlayer);
![]()
В этом примере была создана простая система отслеживания лиц, которая автоматически обнаруживает и отслеживает одну грань. Попробуйте изменить входное видео и проверить, можно ли отследить лицо. Если вы заметили плохие результаты отслеживания, проверьте данные канала тона, чтобы убедиться в достаточном контрасте между областью лица и фоном.
[1] Г. Р. Брадски «Отслеживание лица и объекта в реальном времени как компонент перцептивного пользовательского интерфейса», материалы 4-го семинара IEEE по применению компьютерного зрения, 1998.
[2] Виола, Пол А. и Джонс, Майкл Дж. «Быстрое обнаружение объектов с использованием усиленного каскада простых функций», IEEE CVPR, 2001.