从视频中提取图像,将其更改为灰度并找出差异

时间:2014-09-06 09:20:45

标签: matlab image-processing motion-detection

我正在编写一个函数,它采取以下操作:从视频中提取,将帧转换为灰度,并计算我提取的前两个图像之间的差异。

到目前为止,我已经完成了代码。但我不知道如何提取以前提取的图像。任何人都可以就此提供一些指导吗?

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 个答案:

答案 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类将每个结构元素写入文件。然后,您就可以制作一部显示连续帧之间差异的电影。