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