Vous êtes sur la page 1sur 3

Master GE Traitement d’images TP1

Objectif
Soit une caméra qui filme le trafic des véhicules. On demande d’écrire un programme pour
détecter un véhicule et calculer sa vitesse.

Lecture et informations d’un fichier vidéo


Matlab fournit une API (VideoReader ()) pour la création d’un objet contenant toutes les
informations sur la vidéo.

>> obj = VideoReader('traffic.mp4')

La fonction get() donne plus d'informations :

>> get(obj)
General Settings:
Duration = 14.8000
Name = traffic.mp4
Path = D:\Cours\Traitement_Image\Master\camera
Tag =
Type = VideoReader
UserData = []
Video Settings:
BitsPerPixel = 24
FrameRate = 10
Height = 408
NumberOfFrames = 148
VideoFormat = RGB24
Width = 420

On peut visionner la vidéo en utilisant la fonction :

>> implay('traffic.mp4');

Extraction d’une image


Tous les pixels qui ont une intensité inférieure à un seuil seront éliminés (transformé en noir).
Pour cela, on utilise la fonction imextendedmax (darkCar, darkCarValue). Nous avons choisi
50 comme valeur de seuil, car il est un peu au-dessus de l'intensité moyenne de la voiture de
couleur sombre.

obj = VideoReader('traffic.avi');
darkCar = rgb2gray(read(obj,71));
darkCarValue = 50;
noDarkCar = imextendedmax(darkCar, darkCarValue);
imshow(darkCar)
figure, imshow(noDarkCar)
Master GE Traitement d’images TP1

Nous sommes confrontés à deux problèmes :


1. Dans l'image traitée, nous avons supprimé les voitures de couleur sombre (il reste
quelques traces de la voiture de couleur sombre).
2. Les voies-marquées ne sont pas éliminées parce que leurs valeurs de pixels sont au-dessus
du seuil.
Traitement morphologique en utilisant imopen ()
Le terme morphologique peut être considéré comme synonyme de «taille» géométrique : Tout
objet plus petit que la certaine taille (largeur ou longueur) sera rejeté. Donc, non seulement les
petits objets de la voiture de couleur sombre seront supprimés, mais aussi les blancs marques
de voie de couleurs vives auront disparu.

obj = VideoReader('traffic.avi');
darkCar = rgb2gray(read(trafficObj,71));
darkCarValue = 50;
noDarkCar = imextendedmax(darkCar, darkCarValue);
sedisk = strel('disk',2);
noSmallStructures = imopen(noDarkCar, sedisk);
subplot(131); imshow(darkCar)
subplot(132); imshow(noDarkCar)
subplot(133); imshow(noSmallStructures)

Nous avons supprimé les petits objets en comparant la taille de notre "disque" qui est créé par
la fonction strel (). Cette fonction crée des éléments structurant morphologiques comme
«balle», «carré», «ligne», etc. La fonction imopen () exécute ensuite la morphologie de la
façon suivante :
IM2 = imopen (IM, SE) effectue l'ouverture morphologique sur l’image de niveau de gris IM
avec l'élément structurant SE. L'argument SE doit être un objet unique d'élément structurant.
Master GE Traitement d’images TP1

L'opération d'ouverture morphologique est une érosion suivie d'une dilatation, en utilisant le
même élément structurant pour les deux opérations.

Code pour le suivi de véhicule


obj = VideoReader('traffic.avi');

darkCarValue = 50;
darkCar = rgb2gray(read(obj,71));
noDarkCar = imextendedmax(darkCar, darkCarValue);

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

nframes = get(obj, 'NumberOfFrames');


I = read(obj, 1);
taggedCars = zeros([size(I,1) size(I,2) 3 nframes], class(I));

for k = 1 : nframes
singleFrame = read(obj, k);
I = rgb2gray(singleFrame);
noDarkCars = imextendedmax(I, darkCarValue);

noSmallStructures = imopen(noDarkCars, sedisk);


noSmallStructures = bwareaopen(noSmallStructures, 150);
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

frameRate = get(trafficObj,'FrameRate');
implay(taggedCars,frameRate);