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