В этом примере показано, как автоматически обнаружить и отследить поверхность с помощью характерных точек. Подход в этом примере отслеживает поверхность, даже когда человек наклоняет его голову или перемещается к или далеко от камеры.
Обнаружение объектов и отслеживание важны во многих приложениях компьютерного зрения включая распознавание активности, автомобильную безопасность и наблюдение. В этом примере вы разработаете простую систему слежения поверхности путем деления проблемы отслеживания на три части:
Обнаружьте поверхность
Идентифицируйте черты лица, чтобы отследить
Отследите поверхность
Во-первых, необходимо обнаружить поверхность. Используйте 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