В этом примере показано, как обнаруживать и подсчитывать автомобили в видеопоследовательности с помощью детектора переднего плана на основе моделей гауссовых смесей (GMM).
Обнаружение и подсчет автомобилей можно использовать для анализа схем движения. Обнаружение также является первым шагом перед выполнением более сложных задач, таких как отслеживание или категоризация транспортных средств по их типу.
В этом примере показано, как использовать детектор переднего плана и анализ больших двоичных объектов для обнаружения и подсчета автомобилей в видеопоследовательности. Предполагается, что камера неподвижна. В этом примере основное внимание уделяется обнаружению объектов. Дополнительные сведения об отслеживании объектов см. в примере Отслеживание нескольких объектов на основе движения.
Вместо немедленной обработки всего видео пример начинается с получения начального видеокадра, в котором движущиеся объекты сегментированы от фона. Это помогает постепенно вводить шаги, используемые для обработки видео.
Детектор переднего плана требует определенного количества видеокадров для инициализации модели гауссовой смеси. В этом примере первые 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');

Процесс сегментации переднего плана не является совершенным и часто включает нежелательный шум. В примере используется морфологическое отверстие для удаления шума и заполнения пробелов в обнаруженных объектах.
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');

На заключительном этапе обрабатываем оставшиеся видеокадры.
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

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