Search code examples
imagematlabopencvmotion

Motion History Image (MHI) in Matlab


My project is to detect human activity through stored video clips. I am successfully able to do the following:

  1. Get the Motion History Image (MHI) from a video using OpenCV
  2. Train and classify the set of images using Matlab

However, I want to use Matlab in order to get the Motion History Image (MHI). Is it possible, and if yes can someone guide me? Thank you.

I have attached a sample Motion History Image (MHI)

MHI sample

I have used the following code for MHI: http://www.ece.iastate.edu/~alexs/classes/2007_Fall_401/code/09_MotionHistory/motempl.c


Solution

  • MHI is just a ways of implementing motion detection (and uses silhouettes as the basis of it).

    Let suppose that the silhouette of the most recent object has been created. It also uses a timestamp to identify if the current silhouette is recent or not. The older silhouettes have to be compared with the current silhouette in order to achieve movement detection. Hence, earlier silhouettes are also saved in the image, with an earlier timestamp.

    MHI describes the changes of some moving objects over the image sequence. Basically, you should only maintain an image where every pixel encodes a time information - whether the silhouette is recent or not or where the movement occurs at a given time.

    Therefore the implementation of MHI is very simple e.g.:

    function MHI = MHI(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
    

    Code from: https://searchcode.com/codesearch/view/8509149/


    Update #1:

    Try to draw it as follows:

    % showMHI.m
    % Input frame number and motion history vector to display normalized MHI
    % at the specified frame.
    
    function showMHI(n, motion_history)
    
    frameDisp = motion_history{n};
    frameDisp = double(frameDisp);
    frameDisp = frameDisp ./ 15;
    figure, imshow(frameDisp)
    title('MHI Image');