Обнаружение автомобилей с использованием Смешанных гауссовских моделей

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

Введение

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

В этом примере показано, как использовать детектор переднего плана и анализ больших двоичных объектов для обнаружения и подсчета автомобилей в видеопоследовательности. Он принимает, что камера является стационарной. Пример фокусируется на обнаружении объектов. Чтобы узнать больше об отслеживании объектов, смотрите пример под названием Motion-Based Multiple Object Tracking.

Шаг 1 - Импорт видео и инициализация детектора переднего плана

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

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

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

videoReader = VideoReader('visiontraffic.avi');
for i = 1:150
    frame = readFrame(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');

Затем найдите ограничительные коробки каждого связанного компонента, соответствующего движущемуся автомобилю, используя зрение. Объект анализа больших двоичных объектов. Объект дополнительно фильтрует обнаруженный передний план, отбрасывая шум, который содержит менее 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 hasFrame(videoReader)

    frame = readFrame(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

На выход видео отображаются ограничительные рамки вокруг автомобилей. Также отображается количество автомобилей в левом верхнем углу видео.