Обнаружение автомобилей в видео трафика

Этот пример показывает, как использовать Image Processing Toolbox™, чтобы визуализировать и анализировать видео или последовательности изображений. Этот пример использует VideoReader (MATLAB®), implay и другие функции Image Processing Toolbox, чтобы обнаружить автомобили светлого цвета в видео трафика. Обратите внимание на то, что VideoReader имеет специфичные для платформы возможности и не может смочь считать предоставленное Движение видео JPEG2000 на некоторых платформах.

Шаг 1: доступ к видео с VideoReader

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

Используйте VideoReader, чтобы получить доступ к видео и получить основную информацию об этом.

trafficVid = VideoReader('traffic.mj2')
trafficVid = 

  VideoReader with properties:

   General Properties:
            Name: 'traffic.mj2'
            Path: '/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/images/imdata'
        Duration: 8
     CurrentTime: 0
             Tag: ''
        UserData: []

   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/BR2019ad/build/matlab/toolbox/images/imdata'
        Duration: 8
     CurrentTime: 0
             Tag: ''
        UserData: []

   Video Properties:
           Width: 160
          Height: 120
       FrameRate: 15
    BitsPerPixel: 24
     VideoFormat: 'RGB24'

Шаг 2: исследуйте видео с IMPLAY

Исследуйте видео в implay.

implay('traffic.mj2');

Шаг 3: разработайте свой алгоритм

При работе с видеоданными может быть полезно выбрать представительный кадр из видео и разработать алгоритм на том кадре. Затем этот алгоритм может быть применен к обработке всех кадров в видео.

Для этого помечающего автомобиль приложения исследуйте кадр, который включает и и темные автомобили светлого цвета. Когда изображение имеет много структур, как кадры видео трафика, полезно упростить изображение как можно больше прежде, чем попытаться обнаружить предмет интереса. Один способ сделать это для автомобильного приложения маркировки должно подавить все объекты в изображении, которые не являются автомобилями светлого цвета (темные автомобили, маршруты, трава, и т.д.). Как правило, это берет комбинацию методов, чтобы удалить эти посторонние объекты.

Один способ удалить темные автомобили из кадров видео состоит в том, чтобы использовать функцию 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 (должны только быть автомобили светлого цвета). Используйте эту информацию, чтобы расположить тег на автомобили светлого цвета в исходном видео.

Шаг 4: примените алгоритм к видео

Помечающее автомобиль приложение обрабатывает видео один кадр за один раз в цикле. (Поскольку типичное видео содержит большое количество кадров, потребовалась бы большая память, чтобы считать и обработать все кадры целиком.)

Маленькое видео (как то в этом примере) могло быть обработано целиком, и существует много функций, которые предусматривают эту возможность. Для получения дополнительной информации смотрите Функции Тулбокса Та работа с Последовательностями изображений.

Для более быстрой обработки предварительно выделите память, используемую, чтобы сохранить обработанное видео.

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

Шаг 5: Визуализация результатов

Получите частоту кадров исходного видео и используйте его, чтобы видеть taggedCars в implay.

frameRate = trafficVid.FrameRate;
implay(taggedCars,frameRate);

Смотрите также

| | | | | |

Похожие темы