exponenta event banner

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

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

Введение

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

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

Шаг 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');

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

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