MATLAB中的实时运动历史图像(MHI)



我的项目是通过存储的视频剪辑来检测人类活动。我使用以下代码来获取视频剪辑的运动历史记录图像(MHI)。

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

但是,现在我想实时扩展项目并显示运动历史记录图像(MHI)。也就是说,将从网络摄像头捕获框架,并捕获它们,将显示运动历史图像(MHI)。我该如何实现?

任何帮助将不胜感激。谢谢。

您绝对应该矢量化循环。您也可以将3D数组用于MHI而不是单元格数组。我尚未测试它,但是代码应该看起来像这样:

MHI = zeros(y_max, x_max, numel(fg));
MHI(:,:,1) = fg{1} .* T;
for frameIndex = 2:length(fg)
  mhi = MHI(:,:,frameIndex);
  mhi(fg{frameIndex} == 255) = T;
  prevMHI = MHI(:,:,frameIndex-1);
  idx = prevMHI > 1;
  mhi(idx) = prevMHI(idx) - 1;
end

最新更新