Обнаружение автомобилей Используя гауссовы модели смеси

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

Введение

Обнаружение и подсчет автомобилей могут использоваться, чтобы анализировать шаблоны трафика. Обнаружение является также первым шагом до выполнения более сложных задач, таких как отслеживание или классификация автомобилей их типом.

Этот пример показывает, как использовать приоритетный детектор и анализ блоба, чтобы обнаружить и считать автомобили в видео последовательности. Это принимает, что камера является стационарной. Пример фокусируется на обнаружении объектов. Чтобы узнать больше об отслеживании объектов, смотрите пример, названный Основанный на движении Несколько Объектное Отслеживание.

Шаг 1 - импортирует видео и инициализирует приоритетный детектор

Вместо того, чтобы сразу обработать целое видео, пример запускается путем получения начального кадра видео, в котором движущиеся объекты сегментируются происхождения. Это помогает постепенно ввести шаги, используемые, чтобы обработать видео.

Приоритетный детектор требует определенного числа кадров видео в порядке инициализировать Гауссову модель смеси. Этот пример использует первые 50 кадров, чтобы инициализировать три режима Gaussian в модели смеси.

foregroundDetector = vision.ForegroundDetector('NumGaussians', 3, ...
    'NumTrainingFrames', 50);

videoReader = vision.VideoFileReader('visiontraffic.avi');
for i = 1:150
    frame = step(videoReader); % read the next video frame
    foreground = step(foregroundDetector, frame);
end

После обучения детектор начинает выводить более надежные результаты сегментации. Две фигуры ниже показа один из кадров видео и приоритетной маски вычисляются детектором.

figure; imshow(frame); title('Video Frame');

figure; imshow(foreground); title('Foreground');

Шаг 2 - обнаруживает автомобили в начальном кадре видео

Приоритетный процесс сегментации не совершенен и часто включает нежелательный шум. Пример использует морфологическое открытие, чтобы удалить шум и заполнить разрывы в обнаруженных объектах.

se = strel('square', 3);
filteredForeground = imopen(foreground, se);
figure; imshow(filteredForeground); title('Clean Foreground');

Затем, мы находим ограничительные рамки каждого связанного компонента, соответствующего движущемуся автомобилю при помощи видения. Объект BlobAnalysis. Объектные дальнейшие фильтры обнаруженный передний план путем отклонения блобов, которые содержат меньше чем 150 пикселей.

blobAnalysis = vision.BlobAnalysis('BoundingBoxOutputPort', true, ...
    'AreaOutputPort', false, 'CentroidOutputPort', false, ...
    'MinimumBlobArea', 150);
bbox = step(blobAnalysis, filteredForeground);

Чтобы подсветить обнаруженные автомобили, мы чертим зеленые поля вокруг них.

result = insertShape(frame, 'Rectangle', bbox, 'Color', 'green');

Количество ограничительных рамок соответствует количеству автомобилей, найденных в кадре видео. Мы отображаем количество найденных автомобилей в левом верхнем углу обработанного кадра видео.

numCars = size(bbox, 1);
result = insertText(result, [10 10], numCars, 'BoxOpacity', 1, ...
    'FontSize', 14);
figure; imshow(result); title('Detected Cars');

Шаг 3 - остальная часть процесса кадров видео

В последнем шаге мы обрабатываем остающиеся кадры видео.

videoPlayer = vision.VideoPlayer('Name', 'Detected Cars');
videoPlayer.Position(3:4) = [650,400];  % window size: [width, height]
se = strel('square', 3); % morphological filter for noise removal

while ~isDone(videoReader)

    frame = step(videoReader); % read the next video frame

    % Detect the foreground in the current video frame
    foreground = step(foregroundDetector, frame);

    % Use morphological opening to remove noise in the foreground
    filteredForeground = imopen(foreground, se);

    % Detect the connected components with the specified minimum area, and
    % compute their bounding boxes
    bbox = step(blobAnalysis, filteredForeground);

    % Draw bounding boxes around the detected cars
    result = insertShape(frame, 'Rectangle', bbox, 'Color', 'green');

    % Display the number of cars found in the video frame
    numCars = size(bbox, 1);
    result = insertText(result, [10 10], numCars, 'BoxOpacity', 1, ...
        'FontSize', 14);

    step(videoPlayer, result);  % display the results
end

release(videoReader); % close the video file

Выходные видеодисплеи ограничительные рамки вокруг автомобилей. Это также отображает количество автомобилей в левом верхнем углу видео.