Matlab中最后10个数字/帧的范围

时间:2016-04-06 16:40:43

标签: matlab image-processing video-processing matlab-cvst

我需要从视频文件中检索/注册/记住最后10帧。这是用于检测微表情的更大项目的小版本。因此,需要检查最后10帧(检测到)是否显示“行”,或者是否显示超过10行,然后检测不到。我也被强制要与vision.VideoFileReadervision.OpticalFlow合作。怎么做?

file = 'MEXTest.mp4';
vid = vision.VideoFileReader(file,'ImageColorSpace','RGB','VideoOutputDataType','single');
optFlo = vision.OpticalFlow('OutputValue','Horizontal and vertical components in complex form','ReferenceFrameDelay',3);
shapeInsertOptFloColor = vision.ShapeInserter('Shape','Lines','BorderColor','Custom','CustomBorderColor',[255 255 0]);

numFrames = 0;
frameList = {};
hasLines = zeros(10, 1, 'logical');

figH = figure;

while ~isDone(vid)
    colorFrame  = step(vid);
    colorFrameRes = imresize(colorFrame,0.3);
    grayFrame = rgb2gray(colorFrameRes);

    optFloVectors = step(optFlo, grayFrame);
    lines = oflo(optFloVectors,20);
    motionVectors = step(shapeInsertOptFloColor, colorFrameRes, lines);
    imshow(motionVectors); title('Optical Flow on Frame');

    notEmpty = ~isempty(lines);
    if numel(notEmpty) ~= 1, notEmpty = 1; end

    hasLines = [hasLines(2:end); notEmpty];

    if numFrames >= 10
        frameList = [frameList(2:end) colorFrame];
    else
        frameList = [frameList colorFrame];
    end

    numFrames = numFrames + 1;

    if numFrames >= 10 && all(hasLines)
        disp('Micro-Expression Detected')
    else
        disp('Not detected')
    end

    if ~ishghandle(figH)
        close all
        break
    end
end
release(vid);

1 个答案:

答案 0 :(得分:1)

我没有那么多关于视频的工作 - 但一般的程序是将它存储在一组结构中。如果是框架调用,则可以使用以下命令对其进行初始化:

frames(10) = struct('prob1',0,'prob2',0,...,'probn',0);

其中prob1,prob2,...,probn是您要保存的帧的属性。然后,每次加载帧时,都以相同的方式将该帧的属性保存到结构框架中。

frame = struct('prob1',val1,'prob2',val2,...,'probn',valn);

其中val1,val2,...,valn是一切,包括作为矩阵的框架。在此之后将其保存到列表

frames = [frames(2:end),frame];

然后在每个时间点,您都可以从之前的10个帧中获得所需的属性,您可以通过以下方式访问这些属性:

frames(2).prob2

它将为您提供8帧前帧的第二个属性。所以这只是你已经拥有的一个小小的改变,但是(如果我理解你的问题)它应该解决问题。