В этом примере показано, как автоматически обнаружить и отследить лицо в прямом видеопотоке, используя алгоритм KLT.
Обнаружение объектов важны во многих приложениях компьютерного зрения, включая распознавание активности, безопасность автомобилей и наблюдение. В этом примере вы разработаете простую систему для отслеживания одной грани в прямом видеопотоке, захваченном веб-камерой. MATLAB обеспечивает поддержку веб-камеры через пакет аппаратной поддержки, который вам нужно будет загрузить и установить в порядок, чтобы запустить этот пример. Пакет поддержки доступен через программу установки пакета поддержки.
Система отслеживания лиц в этом примере может быть в одном из двух режимов: обнаружение или отслеживание. В режиме обнаружения можно использовать vision.CascadeObjectDetector
объект для обнаружения грани в текущей системе координат. Если грань обнаружена, необходимо обнаружить угловые точки на грани, инициализировать vision.PointTracker
объект, а затем переключиться в режим отслеживания.
В режиме отслеживания необходимо отслеживать точки с помощью точечного трекера. Когда вы отслеживаете точки, некоторые из них будут потеряны из-за окклюзии. Если число точек падает ниже порога, это означает, что лицо больше не отслеживается. Затем необходимо переключиться назад в режим обнаружения, чтобы попытаться повторно получить лицо.
Создайте объекты для обнаружения лиц, отслеживания точек, приобретения и отображения видеокадров.
% Create the face detector object. faceDetector = vision.CascadeObjectDetector(); % Create the point tracker object. pointTracker = vision.PointTracker('MaxBidirectionalError', 2); % Create the webcam object. cam = webcam(); % Capture one frame to get its size. videoFrame = snapshot(cam); frameSize = size(videoFrame); % Create the video player object. videoPlayer = vision.VideoPlayer('Position', [100 100 [frameSize(2), frameSize(1)]+30]);
Захват и обработка видеокадров из веб-камеры в цикле для обнаружения и отслеживания лица. Цикл будет запускаться в течение 400 систем координат или до тех пор, пока окно видеоплеера не закроется.
runLoop = true; numPts = 0; frameCount = 0; while runLoop && frameCount < 400 % Get the next frame. videoFrame = snapshot(cam); videoFrameGray = rgb2gray(videoFrame); frameCount = frameCount + 1; if numPts < 10 % Detection mode. bbox = faceDetector.step(videoFrameGray); if ~isempty(bbox) % Find corner points inside the detected region. points = detectMinEigenFeatures(videoFrameGray, 'ROI', bbox(1, :)); % Re-initialize the point tracker. xyPoints = points.Location; numPts = size(xyPoints,1); release(pointTracker); initialize(pointTracker, xyPoints, videoFrameGray); % Save a copy of the points. oldPoints = xyPoints; % Convert the rectangle represented as [x, y, w, h] into an % M-by-2 matrix of [x,y] coordinates of the four corners. This % is needed to be able to transform the bounding box to display % the orientation of the face. bboxPoints = bbox2points(bbox(1, :)); % Convert the box corners into the [x1 y1 x2 y2 x3 y3 x4 y4] % format required by insertShape. bboxPolygon = reshape(bboxPoints', 1, []); % Display a bounding box around the detected face. videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, 'LineWidth', 3); % Display detected corners. videoFrame = insertMarker(videoFrame, xyPoints, '+', 'Color', 'white'); end else % Tracking mode. [xyPoints, isFound] = step(pointTracker, videoFrameGray); visiblePoints = xyPoints(isFound, :); oldInliers = oldPoints(isFound, :); numPts = size(visiblePoints, 1); if numPts >= 10 % Estimate the geometric transformation between the old points % and the new points. [xform, inlierIdx] = estimateGeometricTransform2D(... oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4); oldInliers = oldInliers(inlierIdx, :); visiblePoints = visiblePoints(inlierIdx, :); % Apply the transformation to the bounding box. bboxPoints = transformPointsForward(xform, bboxPoints); % Convert the box corners into the [x1 y1 x2 y2 x3 y3 x4 y4] % format required by insertShape. bboxPolygon = reshape(bboxPoints', 1, []); % Display a bounding box around the face being tracked. videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, 'LineWidth', 3); % Display tracked points. videoFrame = insertMarker(videoFrame, visiblePoints, '+', 'Color', 'white'); % Reset the points. oldPoints = visiblePoints; setPoints(pointTracker, oldPoints); end end % Display the annotated video frame using the video player object. step(videoPlayer, videoFrame); % Check whether the video player window has been closed. runLoop = isOpen(videoPlayer); end % Clean up. clear cam; release(videoPlayer); release(pointTracker); release(faceDetector);
Виола, Пол А. и Джонс, Майкл Дж. «Быстрое обнаружение объектов с использованием усиленного каскада простых функций», IEEE CVPR, 2001.
Брюс Д. Лукас и Такео Канаде. Итерационный метод регистрации изображений с приложением к видению стерео. Международная совместная конференция по искусственному интеллекту, 1981 год.
Карло Томази и Такео Канаде. Обнаружение и отслеживание функций точки. Технический доклад Университета Карнеги-Меллона CMU-CS-91-132, 1991 год.
Цзяньбо Ши и Карло Томази. Хорошие функции для отслеживания. IEEE Conference on Компьютерное Зрение and Pattern Recognition, 1994.
Зденек Калал, Крыстиан Миколайчик и Иржи Матас. Прямая-обратная ошибка: автоматическое обнаружение отказов отслеживания. Международная конференция по распознаванию шаблонов, 2010 год