0

Je travaille sur un projet de reconnaissance d'actions utilisant des images d'historique de mouvement dans matlab. Je suis nouveau dans ce domaine. J'ai fait de la soustraction en arrière-plan en utilisant la méthode de différenciation des images pour obtenir des images qui ne comportent que la personne en mouvement. Maintenant, je veux calculer MHI. J'ai trouvé le code suivant pour MHI. Je n'ai pas compris ce qu'est fg {1} et comment l'utiliser. Toute aide serait appréciée. Je vous remercie.Image d'historique de mouvement dans Matlab

vid= VideoReader('PS7A1P1T1.avi'); 
n = vid.NumberOfFrames; 

fg = cell(1, n); 

for i = 1:n 
     frame = read(vid,i); 
     frame = rgb2gray(frame); 
     fg{i} = frame; 
end 
%--------------------------------------------------------------- 
%background subtraction using frame differencing method 
thresh = 25;    
bg = fg{1};   % read in 1st frame as background frame 
% ----------------------- set frame size variables ----------------------- 
fr_size = size(bg);    
width = fr_size(2); 
height = fr_size(1); 
% --------------------- process frames ----------------------------------- 
for i = 2:n 

    fr = fg{i};  % read in frame 

    fr_diff = abs(double(fr) - double(bg)); % cast operands as double to avoid negative overflow 

    for j=1:width     % if fr_diff > thresh pixel in foreground 
     for k=1:height 
      if ((fr_diff(k,j) > thresh)) 
       fg {i}(k,j) = fr(k,j); 
      else 
       fg {i}(k,j) = 0; 
      end 
     end 
    end 

    bg = fr; 

    imshow(fg{i}) 

end 

out = MHI(fg); 

// ---------------------------------------- fonction ICM ICM = (fg)

% Initialize the output, MHI a.k.a. H(x,y,t,T) 
MHI = fg; 

% Define MHI parameter T 
T = 15; % # of frames being considered; maximal value of MHI. 

% Load the first frame 
frame1 = fg{1}; 

% Get dimensions of the frames 
[y_max x_max] = size(frame1); 

% Compute H(x,y,1,T) (the first MHI) 
MHI{1} = fg{1} .* T; 

% Start global loop for each frame 
for frameIndex = 2:length(fg) 

    %Load current frame from image cell 
    frame = fg{frameIndex}; 

    % Begin looping through each point 
    for y = 1:y_max 
     for x = 1:x_max 
      if (frame(y,x) == 255) 
       MHI{frameIndex}(y,x) = T; 
      else 
       if (MHI{frameIndex-1}(y,x) > 1) 
        MHI{frameIndex}(y,x) = MHI{frameIndex-1}(y,x) - 1; 
       else 
        MHI{frameIndex}(y,x) = 0; 
       end 
      end 
     end 
    end 
end 
+0

Si je l'ai aidé, envisager d'accepter ma réponse à laisser la communauté sachez que vous n'avez plus besoin d'aide. Bonne chance – rayryeng

+0

Merci beaucoup. –

Répondre

1

fg{1} est très probablement la première trame d'une vidéo en niveaux de gris. Compte tenu de vos commentaires, vous utilisez la classe VideoReader pour lire les images. En tant que tel, lire dans chaque image individuellement, convertir en niveaux de gris puis placer sur une cellule dans un tableau de cellules. Lorsque vous avez terminé, appelez le script.

Voici le code modifié de vos commentaires pour répondre à cette tâche:

vid = VideoReader('PS7A1P2T1.avi'); 
n = vid.NumberOfFrames; 

fg = cell(1, n); 

for i = 1:n 
    frame = read(vid,i); 
    frame = rgb2gray(frame); 
    fg{i} = frame; 
end 

Vous pouvez ensuite appeler le script MHI:

out = MHI(fg); 
+0

Merci beaucoup pour votre réponse. Je lis la vidéo en utilisant le code suivant. Je n'ai utilisé aucune matrice. Il semble que je le fais d'une mauvaise façon? vid = VideoReader ('PS7A1P2T1.avi'); OutVideoDir = 'SÉQUENCES D'IMAGE'; mkdir (OutVideoDir); numFrames = vid.NumberOfFrames; n = numFrames; Pour i = 1: n frames = read (vid, i); images = rgb2gray (images); baseFileName = sprintf ('% d.jpg', i); % par exemple. "1.jpg" fullFileName = fichier complet (OutVideoDir, baseFileName); imwrite (frames, fullFileName); fin –

+0

Oui, vous utilisez VideoReader. Je n'étais pas au courant que vous utilisiez cette interface. Je vais modifier ma réponse plus tard pour résoudre ce problème. Je ne suis pas devant un ordinateur actuellement. – rayryeng

+0

Ok, merci beaucoup pour votre aide. Appréciez-le. –