使用 MATLAB 從視訊中提取幀

Ammar Ali 2021年11月29日
使用 MATLAB 從視訊中提取幀

本教程將討論在 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
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook