В этом примере показано, как автоматически обнаружить и отследить поверхность в живом видеопотоке, с помощью алгоритма 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, oldInliers, visiblePoints] = estimateGeometricTransform(... oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4); % 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 по компьютерному зрению и распознаванию образов, 1994.
Зденек Кэлэл, Кристиэн Миколэджчик и Иржи Матас. Прямая обратная ошибка: автоматическое обнаружение отслеживания отказов. Международная конференция по вопросам распознавания образов, 2010