从视频中提取图像,将其更改为灰度并找出差异
Posted
技术标签:
【中文标题】从视频中提取图像,将其更改为灰度并找出差异【英文标题】:Extract images from video, change them to grayscale and find the differences 【发布时间】:2014-09-06 09:20:44 【问题描述】:我正在编写一个函数,它执行以下操作:从视频中提取,将帧转换为灰度并计算我提取的前两个图像之间的差异。
到目前为止,我已经完成了代码。但我不知道如何提取之前提取的图像。任何人都可以提供一些指导吗?
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
【问题讨论】:
【参考方案1】:阅读您的问题描述,您想在前一帧和当前帧之间进行帧差(灰度)。您可以做的是将第一帧存储为临时变量,然后在您的 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
类的文件。然后,您将能够制作一部显示连续帧之间差异的电影。
【讨论】:
以上是关于从视频中提取图像,将其更改为灰度并找出差异的主要内容,如果未能解决你的问题,请参考以下文章