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

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

Введение

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

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

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

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

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

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');

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

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