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

В этом примере показано, как использовать 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/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'

Шаг 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);

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

| | | | | |

Похожие темы