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