exponenta event banner

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

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

Шаг 1: Доступ к видео с помощью VideyReader

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

Использовать VideoReader для доступа к видео и получения основных сведений о нем.

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

  VideoReader with properties:

   General Properties:
            Name: 'traffic.mj2'
            Path: '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/images/imdata'
        Duration: 8
     CurrentTime: 0
       NumFrames: 120

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

Метод get предоставляет дополнительную информацию о видео, такую как его продолжительность в секундах.

get(trafficVid)
obj = 

  VideoReader with properties:

   General Properties:
            Name: 'traffic.mj2'
            Path: '/mathworks/devel/bat/BR2021ad/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);

См. также

| | | | | |

Связанные темы