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