使用 MATLAB 從視訊中提取幀
Ammar Ali
2021年11月29日
本教程將討論在 Matlab 中使用 read()
函式提取視訊的幀。
在 MATLAB 中使用 read()
函式從視訊中提取幀
一個視訊由許多幀組成。換句話說,它是由圖片組成的,所以當影象或幀一個接一個重複時,我們就會看到一個視訊播放。例如,假設一個視訊由每秒 60 幀組成,這意味著一秒鐘內將有 60 幀。幀變化如此之快,以至於我們只能看到正在播放的視訊。首先,我們需要使用函式 VideoReader()
在 Matlab 中讀取視訊。之後,我們需要使用 NumberOfFrames
屬性找到視訊中存在的總幀數。我們將使用 for 迴圈,它將從 1 開始並以視訊中的最大幀數結束。現在我們將找到視訊中存在的每一幀,並使用函式 subplot()
和 imshow()
將它們顯示在繪圖上。例如,讓我們在 Matlab 中讀取視訊並提取其所有幀。請參閱下面的程式碼。
v = VideoReader('bon_fire_dog_2.mp4');
totalFrames = v.NumberOfFrames;
NFP = ceil(sqrt(totalFrames));
for i=1:totalFrames
frame = read(v,i);
subplot(NFP,NFP,i)
imshow(frame)
end
輸出:
在上面的程式碼中,變數 NPF
設定了上圖中的行數和列數。我們還可以使用 imwrite()
函式將每一幀儲存為資料夾中的影象。請參閱下面的程式碼。
v = VideoReader('bon_fire_dog_2.mp4');
totalFrames = v.NumberOfFrames;
NFP = ceil(sqrt(totalFrames));
for i=1:totalFrames
frame = read(v,i);
ImgName = strcat(int2str(i),'.png');
imwrite(frame, ImgName);
end
上面的程式碼將視訊中存在的所有幀儲存為 .png
檔案格式的影象,儲存在與指令碼檔案相同的目錄中。你還可以更改影象的檔名和副檔名。如果你不想從視訊中提取所有幀,而只想提取視訊的第一幀。為此,你必須將 read()
函式的第二個引數更改為 1,如 read(v,1)
。如果要提取視訊的最後一幀,則必須將第二個引數更改為 inf
,例如 read(v,inf)
。如果要從視訊中提取特定範圍的幀,則必須將第二個引數更改為向量。例如,你可以使用 read(v,[5 10])
函式從視訊 v
中讀取從 5 到 10 的幀。
Author: Ammar Ali