Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовой_цои_2.docx
Скачиваний:
85
Добавлен:
09.02.2015
Размер:
1.35 Mб
Скачать

3. Исследовательская часть

3.2 Алгоритм Виолы-Джонса

Данный алгоритм является одним из самых популярных методов распознавания изображений из-за его высокого быстродействия и простой реализации. Лучшие результаты алгоритм даёт при распознавании лиц. Также этот алгоритм можно использовать и для трекинга.

Первый шаг алгоритма – распознавание нужного объекта. Для этого следует произвести обучение классификаторов Хаара [2].

Распознавание лица на этом шаге алгоритма показано на рис. 1

Рис.1 Распознавание лица

Следующий шаг – определение признаков, по которым будет осуществляться трекинг. Например, такими признаками могут быть цвет, форма, текстура. Для хорошего результата следует выбирать такой признак, который не меняет своих свойств по мере движения объекта (например, цвет кожи).

Затем к видеоизображению применяется трекер, основанный на гистограммах. Этот трекер использует алгоритм CAMShift, который предоставляет возможность трекинга, используя гистограмму значений пикселей (рис.2)

Рис.2 Канал оттенка

Пример программы в системе MATLAB приведён ниже.

% создание объекта-классификатора

faceDetector = vision.CascadeObjectDetector();

% чтение видеофайла и запуск детектора

videoFileReader = vision.VideoFileReader('visionface.avi');

videoFrame = step(videoFileReader);

bbox = step(faceDetector, videoFrame);

% отрисовка квадрата вокруг лица

videoOut = ertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');

figure, imshow(videoOut), title('Detected face');

% получение информации о цвете кожи путем извлечения канала оттенка из кадра видео, переконвертированного в цветовое пространство HSV

[hueChannel,~,~] = rgb2hsv(videoFrame);

% показ канала оттенка и квадрата вокруг лица

figure, imshow(hueChannel), title('Hue channel data');

rectangle('Position',bbox(1,:),'LineWidth',2,'EdgeColor',[1 1 0])

% Распознавание носа. Он наиболее полно отражает цвет кожи, так как не содержит фоновых пикселей

noseDetector = vision.CascadeObjectDetector('Nose');

faceImage = imcrop(videoFrame,bbox(1,:));

noseBBox = step(noseDetector,faceImage);

noseBBox(1,1:2) = noseBBox(1,1:2) + bbox(1,1:2);

% создание объекта-трекера

tracker = vision.HistogramBasedTracker;

% Инициализация гистограммы трекера, используя пиксели с канала оттенка

initializeObject(tracker, hueChannel, noseBBox(1,:));

%Создание объекта, отвечающего за отображение видео-кадров

videoInfo = info(videoFileReader);

videoPlayer = vision.VideoPlayer('Position',[300 300 videoInfo.VideoSize+30]);

% Трекинг лица, пока видео не закончится

while ~isDone(videoFileReader)

% Следующий кадр

videoFrame = step(videoFileReader);

% Перевод кадра из RGB в HSV

[hueChannel,~,~] = rgb2hsv(videoFrame);

% Трекинг с использованием данных с канала оттенка

bbox = step(tracker, hueChannel);

% Отрисовка квадрата вокруг лица

videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');

% Показ видео

step(videoPlayer, videoOut);

end

% освобождение ресурсов

release(videoFileReader);

release(videoPlayer);

Данный алгоритм отлично работает при распознавании лиц, дорожных знаков, номеров автомобилей. Его можно использовать для слежения за подозрительными лицами в толпе людей. Преимущество алгоритма также заключается в том, что камера не обязательно должна быть неподвижной. Недостаток конкретной реализации в том, что трекер может распознать также элементы, не относящиеся к заданию (рис.3) , но обладающие сходными признаками (например, цвет кожи)

Рис. 3 Ошибки распознавания