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