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

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 类的文件。然后,您将能够制作一部显示连续帧之间差异的电影。

【讨论】:

以上是关于从视频中提取图像,将其更改为灰度并找出差异的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 进行天空分析的图像 [关闭]

图像视频相似度算法

将视频转换为单张图片(灰度)【MATLAB】

如何使用 python 和 openCV 从 .yuv 视频文件 (YUV420) 中提取帧?

从视频中提取海报图像

HTML5 从图像生成视频