2014-09-06 60 views
-2

我正在編寫一個函數,它需要執行以下操作:從視頻中提取圖像,將幀轉換爲灰度並計算我提取的前兩幅圖像之間的差異。從視頻中提取圖像,將它們更改爲灰度,並找到差異

我已經完成了這一點的代碼。但我不知道如何提取之前提取的圖像。任何人都可以提供一些指導呢?

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

讀取您的問題描述,您想要在前一幀和當前幀之間執行幀(灰度)差異。你可以做的是將第一幀存儲爲一個臨時變量,然後在你的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類。然後,您將能夠製作顯示連續幀之間差異的電影。