Catégories
Algorithme Arduino capteur Projets traitement d'image Projets traitement du signal

Projet Détection de Mouvement avec Matlab

Objectifs

  • Savoir activer la caméra de son PC
  • Savoir récupérer une image de la caméra
  • Savoir détecter les mouvements dans une image
  • Savoir définir un opérateur de détection
  • Etc.

Ci-dessous le code commenté du projet. Voir le tutoriel pour  plus de détails

Activation de la Caméra

cam = imaqfind; % Trouver l'objet en mémoire (s'il existe!)

if(~exist('cam'))

    cam=videoinput('winvideo',1);           % Déclaration

    set(cam,'ReturnedColorSpace','GRAY');   % RGB

    triggerconfig(cam, 'manual');           % Définition du Trigger

    start(cam);                             % Déclanchement

else

    delete(cam);

    cam=videoinput('winvideo');

    set(cam,'ReturnedColorSpace','GRAY');

    triggerconfig(cam, 'manual');

    start(cam);

end;

Paramètres du programme

M=256; N=256;

Nfil=3; % Taille du Buffer

im_A=zeros(Nfil,M,N);

i=1;j=1;

Iter=1;




K=64;

I_RMSE=zeros(1,K);

Det=zeros(1,K);

Seuil=0.05;

Boucle principale : Détection & Affichage

while 1

    %% Lecture de l'image courante

    im=imadjust(im2double(getsnapshot(cam)));

    im_in=imresize(im,[M N]);

    %% Calcul de l'intensité / Détection

    % Intensité/Détection

    Moy=squeeze(mean(im_A)) ;

    I_diff=Moy(:)-im_in(:);

    RMSE=sqrt(mean(I_diff.^2));     % RMSE f & g

    I_RMSE(i)=RMSE;                 % Intensité

    Det(i)=0.25*(I_RMSE(i)>Seuil);            % Signal de détection

  

    % Mise à jour de l'indice (détecteur)

    i=i+1;

    if i==K+1

        i=1;

        I_RMSE=0*I_RMSE;

        Det=0*Det;

    end;

   

    %% Mise à jour du buffer

    im_A(j,:,:)=im_in;

    j=j+1;

    if j==Nfil+1

        j=1;

    end;

   

    Iter=Iter+1; % Numéro des frames

   

    %% Affichage

    if Iter<2*Nfil

        Det=Det*0;

    else

        figure(1);

        subplot(121); imagesc([Moy-im_in]);colormap(gray);colorbar;

        subplot(122);

        plot(I_RMSE,'-*','linewidth',3);xlim([1 K]); grid on; hold on;

        stem(Det,'r-*','linewidth',3); hold off;

        if RMSE>Seuil

            title('Objet Détecté', 'fontsize',16);

        else

            title('Objet Non Détecté', 'fontsize',16);

        end;

    end;




    % Prise des photos de l'objet détecté

    if RMSE>Seuil

        for m=1:10

            s=strcat('im_',num2str(Iter),'_',num2str(m),'.png');

            im0=getsnapshot(cam);

            imwrite(im0,s);

        end;

    end;

end

Programme Principal

close all; clc; clear all;


%% Activation de la Caméra
cam = imaqfind; % Trouver l'objet en mémoire (s'il existe!)
if(~exist('cam'))
cam=videoinput('winvideo',1); % Déclaration
set(cam,'ReturnedColorSpace','GRAY'); % RGB
triggerconfig(cam, 'manual'); % Définition du Trigger
start(cam); % Déclanchement
else
delete(cam);
cam=videoinput('winvideo');
set(cam,'ReturnedColorSpace','GRAY');
triggerconfig(cam, 'manual');
start(cam);
end;

%% Paramètres du programme
M=256; N=256;
Nfil=3; % Taille du Buffer
im_A=zeros(Nfil,M,N);
i=1;j=1;
Iter=1;

K=64;
I_RMSE=zeros(1,K);
Det=zeros(1,K);
Seuil=0.05;


%% Détection & Affichage
while 1
%% Lecture de l'image courante
im=imadjust(im2double(getsnapshot(cam)));
im_in=imresize(im,[M N]);

%% Calcul de l'intensité / Détection

% Intensité/Détection
Moy=squeeze(mean(im_A)) ;
I_diff=Moy(:)-im_in(:);
RMSE=sqrt(mean(I_diff.^2)); % RMSE f & g
I_RMSE(i)=RMSE; % Intensité
Det(i)=0.25*(I_RMSE(i)>Seuil); % Signal de détection

% Mise à jour de l'indice (détecteur)
i=i+1;
if i==K+1
i=1;
I_RMSE=0*I_RMSE;
Det=0*Det;
end;




%% Mise à jour du buffer
im_A(j,:,:)=im_in;
j=j+1;
if j==Nfil+1
j=1;
end;

Iter=Iter+1; % Numéro des frames

%% Affichage
if Iter<2*Nfil
Det=Det*0;
else
figure(1);
subplot(121); imagesc([Moy-im_in]);colormap(gray);colorbar;
subplot(122);
plot(I_RMSE,'-*','linewidth',3);xlim([1 K]); grid on; hold on;
stem(Det,'r-*','linewidth',3); hold off;
if RMSE>Seuil
title('Objet Détecté', 'fontsize',16);
else
title('Objet Non Détecté', 'fontsize',16);
end;
end;


% Prise des photos de l'objet détecté
if RMSE>Seuil
for m=1:10
s=strcat('im_',num2str(Iter),'_',num2str(m),'.png');
im0=getsnapshot(cam);
imwrite(im0,s);
end;
end;
end

Accueil Traitement d’Images | Matlab

Laisser un commentaire