阅读您的问题描述,您想在前一帧和当前帧之间进行帧差(灰度)。您可以做的是将第一帧存储为临时变量,然后在您的 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 类的文件。然后,您将能够制作一部显示连续帧之间差异的电影。