Contenido principal

Detectar coches en un vídeo de tráfico

Este ejemplo muestra cómo utilizar Image Processing Toolbox™ para visualizar y analizar secuencias de vídeos o imágenes. Este ejemplo utiliza VideoReader (MATLAB®), implay y otras funciones de Image Processing Toolbox para detectar coches de color claro en un vídeo de tráfico. VideoReader tiene prestaciones específicas de la plataforma y es posible que no pueda leer el vídeo en formato Motion JPEG2000 proporcionado en algunas plataformas.

Paso 1: Acceder al vídeo con VideoReader

La función VideoReader construye un objeto lector multimedia que puede leer datos de vídeo de un archivo multimedia. Consulte VideoReader para obtener más información sobre los formatos que se admiten en su plataforma.

Utilice VideoReader para acceder al vídeo y obtener información básica sobre él.

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

  VideoReader with properties:

   General Properties:
            Name: 'traffic.mj2'
            Path: '/mathworks/devel/bat/filer/batfs2566-0/Bdoc25b.2988451/build/runnable/matlab/toolbox/images/imdata'
        Duration: 8
     CurrentTime: 0
       NumFrames: 120

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

El método GET proporciona más información sobre el vídeo, como por ejemplo, su duración en segundos.

get(trafficVid)
obj = 

  VideoReader with properties:

   General Properties:
            Name: 'traffic.mj2'
            Path: '/mathworks/devel/bat/filer/batfs2566-0/Bdoc25b.2988451/build/runnable/matlab/toolbox/images/imdata'
        Duration: 8
     CurrentTime: 0
       NumFrames: 120

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

Paso 2: Explorar el vídeo con IMPLAY

Explore el vídeo en implay.

implay('traffic.mj2');

Paso 3: Desarrollar el algoritmo

Cuando trabaja con datos de vídeo, puede resultar útil seleccionar un cuadro representativo del vídeo y desarrollar su algoritmo en él. Después, este algoritmo puede aplicarse al procesamiento de todos los cuadros del vídeo.

Para esta aplicación de etiquetado de coches, examine un cuadro que incluya coches de color claro y de color oscuro. Cuando una imagen contiene varias estructuras, como los cuadros de vídeos de tráfico, conviene simplificar la imagen tanto como sea posible antes de intentar detectar un objeto de interés. Una manera de hacer esto en la aplicación de etiquetado de coches es suprimiendo todos los objetos de la imagen que no son coches de color claro (coches de color oscuro, carriles, hierba, etc.). Normalmente, se requiere una combinación de técnicas para eliminar estos objetos no pertinentes.

Un modo de eliminar los coches de color oscuro de los cuadros de vídeo es utilizar la función imextendedmax. Esta función devuelve una imagen binaria que identifica regiones con valores de intensidad superiores a un umbral especificado, denominado máximo regional. El resto de objetos de la imagen con valores de píxel inferiores a este umbral se incorporan al fondo de la imagen. Para eliminar los coches de color oscuro, determine el valor de píxel promedio para estos objetos de la imagen. (Utilice im2gray para convertir el vídeo original de RGB a escala de grises). Puede utilizar la herramienta de región de los píxeles de implay para ver los valores de los píxeles. Especifique el valor de píxel promedio (o un valor ligeramente superior) como el umbral cuando llame a imextendedmax. Para este ejemplo, establezca el valor en 50.

darkCarValue = 50;
darkCar = im2gray(read(trafficVid,71));
noDarkCar = imextendedmax(darkCar, darkCarValue);
imshow(darkCar)
figure, imshow(noDarkCar)

En la imagen procesada, observe cómo se ha eliminado la mayoría de coches de color oscuro mientras que otros objetos extraños todavía son visibles, especialmente las marcas de carril. El procesamiento de los máximos regionales no eliminará las marcas de carril porque sus valores de píxel son superiores al umbral. Para eliminar estos objetos, puede utilizar la función morfológica imopen. Esta función utiliza un procesamiento morfológico para eliminar los objetos pequeños de una imagen binaria y preservar a su vez los objetos grandes. Cuando utiliza el procesamiento morfológico, debe decidir el tamaño y la forma del elemento estructurante utilizado en la operación. Dado que las marcas de carril son objetos finos y alargados, utilice un elemento estructurante con forma de disco y con un radio correspondiente al ancho de las marcas de carril. Puede utilizar la herramienta de región de los píxeles de implay para estimar el ancho de estos objetos. Para este ejemplo, establezca el valor en 2.

sedisk = strel('disk',2);
noSmallStructures = imopen(noDarkCar, sedisk);
imshow(noSmallStructures)

Para completar el algoritmo, utilice regionprops para hallar el centroide de los objetos en noSmallStructures (deberían ser solo los coches de color claro). Utilice esta información para ubicar la etiqueta en los coches de color claro del vídeo original.

Paso 4: Aplicar el algoritmo al vídeo

La aplicación de etiquetado de coches procesa un cuadro de vídeo en cada bucle. Dado que un vídeo estándar contiene un gran número de cuadros, leer y procesar todos los cuadros a la vez requeriría mucha memoria.

Un vídeo pequeño (como el que se muestra en el ejemplo) se puede procesar de una vez, y existen muchas funciones que proporcionan esa opción. Para obtener más información, consulte Process Image Sequences.

Para un procesamiento más rápido, preasigne la memoria utilizada para almacenar el vídeo procesado.

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

Paso 5: Visualizar el resultado

Obtenga la frecuencia de cuadro del vídeo original y utilícela para ver taggedCars en implay.

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

Consulte también

| | | | | |

Temas