В этом примере показано, как автоматически обнаружить и отследить грань с помощью точек функции. Подход в этом примере отслеживает лицо, даже когда человек наклоняет голову или движется к или от камеры.
Обнаружение объектов важны во многих приложениях компьютерного зрения, включая распознавание активности, безопасность автомобилей и наблюдение. В этом примере вы разработаете простую систему отслеживания лиц, разделив задачу отслеживания на три части:
Обнаружение лица
Идентифицируйте функции лица для отслеживания
Отследите лицо
Во-первых, вы должны обнаружить лицо. Используйте 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, :));
Чтобы отслеживать лицо с течением времени, этот пример использует алгоритм Канаде-Лукаса-Томази (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
Системный объект для их отслеживания. Для каждой точки в предыдущей системе координат трекер точек пытается найти соответствующую точку в текущей системе координат. Затем 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);
release(pointTracker);
В этом примере вы создали простую систему отслеживания лиц, которая автоматически обнаруживает и отслеживает одну грань. Попробуйте изменить вход видео и увидеть, сможете ли вы все еще обнаружить и отследить лицо. Убедитесь, что человек обращен к камере в начальной системе координат для шага обнаружения.
Виола, Пол А. и Джонс, Майкл Дж. «Быстрое обнаружение объектов с использованием усиленного каскада простых функций», IEEE CVPR, 2001.
Брюс Д. Лукас и Такео Канаде. Итерационный метод регистрации изображений с приложением к видению стерео. Международная совместная конференция по искусственному интеллекту, 1981 год.
Карло Томази и Такео Канаде. Обнаружение и отслеживание функций точки. Технический доклад Университета Карнеги-Меллона CMU-CS-91-132, 1991 год.
Цзяньбо Ши и Карло Томази. Хорошие функции для отслеживания. IEEE Conference on Компьютерное Зрение and Pattern Recognition, 1994.
Зденек Калал, Крыстиан Миколайчик и Иржи Матас. Прямая-обратная ошибка: автоматическое обнаружение отказов отслеживания. Международная конференция по распознаванию шаблонов, 2010 год