我正在编写一个函数,它采取以下操作:从视频中提取,将帧转换为灰度,并计算我提取的前两个图像之间的差异。
到目前为止,我已经完成了代码。但我不知道如何提取以前提取的图像。任何人都可以就此提供一些指导吗?
function [ vid ] = motion( input_args )
vid = (input_args);
readerobj = VideoReader(vid);
vidFrames = read(readerobj);
numFrames = get(readerobj, 'Number of Frames');
for k = 1 : numFrames
mov(k).cdata = vidFrames(:,:,:,k);
mov(k).colormap = [];
imagename=strcat(int2str(k), '.jpg');
%save inside output folder
imwrite(mov(k).cdata, strcat('output\frame-',imagename));
end
end
答案 0 :(得分:0)
阅读问题描述时,您希望对前一帧和当前帧之间的帧(灰度)进行区分。您可以做的是将第一帧存储为临时变量,然后在for
循环中,您将获取当前帧与前一帧之间的差异。在迭代到下一帧之前,请务必将此当前帧设置为上一帧,然后继续。显然,您需要为已读入的每个帧创建等效的灰度。因此,您应该将for
循环更改为:
prevFrame = rgb2gray(vidFrames(:,:,:,1)); %// Initialize and get grayscale
for k = 2 : numFrames %// Note we start at index 2
currFrame = rgb2gray(vidFrames(:,:,:,k)); %// Get current frame
%// and get grayscale
%// Find difference frame
diffFrame = uint8(abs(double(currFrame) - double(prevFrame)));
mov(k).cdata = cat(3,diffFrame,diffFrame,diffFrame); %// Now save to file
mov(k).colormap = [];
imagename=strcat(int2str(k), '.jpg');
%//save inside output folder
imwrite(mov(k).cdata, strcat('output\frame-',imagename));
prevFrame = currFrame; %// Save for next iteration
end
特别注意我如何计算差异帧。我将每个帧都转换为double
,然后获取绝对差值,然后将其重新设置为uint8
。原因是因为如果你不这样做,如果有任何像素有负差异,MATLAB会将这个差值饱和为0.例如,如果一个像素在一帧中强度为128,那么下一个像素为255 ,差异应该是-127。我们在这里设置abs
,因为这实际上是127的差异。无论我们进入哪个方向都没关系。但是,MATLAB会将此差异视为0,因为小于0的任何一个都被饱和为0因此,我需要将两个帧都转换为double
,因为您从文件中读取的帧很可能是uint8
。一旦找到绝对差异,我们就会重新设定为uint8
,这样我们就可以保存到文件中,并且如果需要也可以显示这些图像。
现在代码会将差异图像保存到文件中。请注意,您将缩短一帧,因为我们从第2帧开始。如果您想比较连续帧之间的差异,这是必要的。请注意,在创建帧时,我必须复制差异帧并使其成为三个通道以模拟RGB帧。对于灰度图像,RGB将使每个通道都相同。这是使用cat
命令完成的,我将差异帧叠加在第三维中三次。
现在你的mov
结构有什么好处,你可以使用这个结构,并使用MATLAB的VideoWriter
类创建一个视频。结构的格式正确,可以写入文件。只需遍历您的结构,并使用VideoWriter
类将每个结构元素写入文件。然后,您就可以制作一部显示连续帧之间差异的电影。