我需要从视频文件中检索/注册/记住最后10帧。这是用于检测微表情的更大项目的小版本。因此,需要检查最后10帧(检测到)是否显示“行”,或者是否显示超过10行,然后检测不到。我也被强制要与vision.VideoFileReader
和vision.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);
答案 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帧前帧的第二个属性。所以这只是你已经拥有的一个小小的改变,但是(如果我理解你的问题)它应该解决问题。