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

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

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

The 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);

См. также

| | | | | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте