В этом примере показано, как использовать Image Processing Toolbox™, чтобы визуализировать и анализировать видео или последовательности изображений. Этот пример использует VideoReader
(MATLAB®), implay
, и другой Image Processing Toolbox функционирует, чтобы обнаружить автомобили светлого цвета в видео трафика. Обратите внимание на то, что VideoReader
имеет специфичные для платформы возможности и может не смочь считать предоставленное Движение видео JPEG2000 на некоторых платформах.
VideoReader
функционируйте создает мультимедийный объект читателя, который может считать видеоданные из мультимедийного файла. Смотрите VideoReader
для получения информации, на которой форматы поддерживаются на вашей платформе.
Используйте VideoReader
получить доступ к видео и получить основную информацию об этом.
trafficVid = VideoReader('traffic.mj2')
trafficVid = VideoReader with properties: General Properties: Name: 'traffic.mj2' Path: '/mathworks/devel/bat/BR2019bd/build/matlab/toolbox/images/imdata' Duration: 8 CurrentTime: 0 NumFrames: 120 Video Properties: Width: 160 Height: 120 FrameRate: 15 BitsPerPixel: 24 VideoFormat: 'RGB24'
Получить метод предоставляет больше информации о видео, таком как его длительность в секундах.
get(trafficVid)
obj = VideoReader with properties: General Properties: Name: 'traffic.mj2' Path: '/mathworks/devel/bat/BR2019bd/build/matlab/toolbox/images/imdata' Duration: 8 CurrentTime: 0 NumFrames: 120 Video Properties: Width: 160 Height: 120 FrameRate: 15 BitsPerPixel: 24 VideoFormat: 'RGB24'
Исследуйте видео в implay
.
implay('traffic.mj2');
При работе с видеоданными может быть полезно выбрать представительную систему координат из видео и разработать алгоритм на той системе координат. Затем этот алгоритм может быть применен к обработке всех систем координат в видео.
Для этого помечающего автомобиль приложения исследуйте систему координат, которая включает и и темные автомобили светлого цвета. Когда изображение имеет много структур, как видеокадры трафика, полезно упростить изображение как можно больше прежде, чем попытаться обнаружить предмет интереса. Один способ сделать это для автомобильного приложения маркировки должно подавить все объекты в изображении, которые не являются автомобилями светлого цвета (темные автомобили, маршруты, трава, и т.д.). Как правило, это берет комбинацию методов, чтобы удалить эти посторонние объекты.
Один способ удалить темные автомобили из видеокадров состоит в том, чтобы использовать imextendedmax
функция. Эта функция возвращает двухуровневое изображение, которое идентифицирует области со значениями интенсивности выше заданного порога, названного региональными максимумами. Все другие объекты в изображении с пиксельными значениями ниже этого порога становятся фоном. Чтобы устранить темные автомобили, определите среднее пиксельное значение для этих объектов в изображении. (Используйте rgb2gray
преобразовывать исходное видео от RGB до шкалы полутонов.) Можно использовать пиксельный инструмент области в implay
просмотреть пиксельные значения. Задайте среднее пиксельное значение (или значение немного выше) как порог, когда вы вызовете imextendedmax
. В данном примере установите значение к 50.
darkCarValue = 50; darkCar = rgb2gray(read(trafficVid,71)); noDarkCar = imextendedmax(darkCar, darkCarValue); imshow(darkCar) figure, imshow(noDarkCar)
В обработанном изображении отметьте, как большинство темных автомобильных объектов удалено, но много других посторонних объектов остаются, особенно маркировки маршрута. Региональная обработка максимумов не удалит маркировки маршрута, потому что их пиксельные значения выше порога. Чтобы удалить эти объекты, можно использовать морфологический функциональный imopen
. Эта функция использует морфологическую обработку, чтобы удалить маленькие объекты из двухуровневого изображения при сохранении больших объектов. При использовании морфологической обработки необходимо выбрать размер и форму элемента структурирования, используемого в операции. Поскольку маркировки маршрута являются длинными и тонкими объектами, используйте дискообразный элемент структурирования с радиусом, соответствующим ширине маркировок маршрута. Можно использовать пиксельный инструмент области в implay
оценить ширину этих объектов. В данном примере установите значение к 2.
sedisk = strel('disk',2);
noSmallStructures = imopen(noDarkCar, sedisk);
imshow(noSmallStructures)
Чтобы завершить алгоритм, используйте regionprops
найти центроид объектов в noSmallStructures
(должны только быть автомобили светлого цвета). Используйте эту информацию, чтобы расположить тег на автомобили светлого цвета в исходном видео.
Помечающее автомобиль приложение обрабатывает видео одна система координат за один раз в цикле. (Поскольку типичное видео содержит большое количество систем координат, потребовалась бы большая память, чтобы считать и обработать все кадры целиком.)
Маленькое видео (как то в этом примере) могло быть обработано целиком, и существует много функций, которые предусматривают эту возможность. Для получения дополнительной информации смотрите Последовательности изображений Процесса.
Для более быстрой обработки предварительно выделите память, используемую, чтобы сохранить обработанное видео.
nframes = trafficVid.NumberOfFrames; I = read(trafficVid, 1); taggedCars = zeros([size(I,1) size(I,2) 3 nframes], class(I)); for k = 1 : nframes singleFrame = read(trafficVid, k); % Convert to grayscale to do morphological processing. I = rgb2gray(singleFrame); % Remove dark cars. noDarkCars = imextendedmax(I, darkCarValue); % Remove lane markings and other non-disk shaped structures. noSmallStructures = imopen(noDarkCars, sedisk); % Remove small structures. noSmallStructures = bwareaopen(noSmallStructures, 150); % Get the area and centroid of each remaining object in the frame. The % object with the largest area is the light-colored car. Create a copy % of the original frame and tag the car by changing the centroid pixel % value to red. taggedCars(:,:,:,k) = singleFrame; stats = regionprops(noSmallStructures, {'Centroid','Area'}); if ~isempty([stats.Area]) areaArray = [stats.Area]; [junk,idx] = max(areaArray); c = stats(idx).Centroid; c = floor(fliplr(c)); width = 2; row = c(1)-width:c(1)+width; col = c(2)-width:c(2)+width; taggedCars(row,col,1,k) = 255; taggedCars(row,col,2,k) = 0; taggedCars(row,col,3,k) = 0; end end
Получите частоту кадров исходного видео и используйте его, чтобы видеть taggedCars
в implay
.
frameRate = trafficVid.FrameRate; implay(taggedCars,frameRate);
VideoReader
| bwareaopen
| imextendedmax
| imopen
| implay
| regionprops
| rgb2gray