[英]Convert Video to Image Sequence MATLAB
我正在嘗試將視頻轉換為圖像序列,在mathworks中,我看到了這樣的代碼
讀取並播放電影文件xylophone.mp4。
xyloObj = VideoReader('xylophone.mp4');
nFrames = xyloObj.NumberOfFrames;
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;
預分配影片結構。
mov(1:nFrames) = ...
struct('cdata',zeros(vidHeight,vidWidth, 3,'uint8'),...
'colormap',[]);
一次讀取一幀。
for k = 1 : nFrames
mov(k).cdata = read(xyloObj,k);
end
當我嘗試這段代碼時,需要很長時間才能編譯它。 有沒有辦法讀取所有幀而不循環,所以我可以使其更快?
無論您做什么,都要花費很長時間。 您正在做的是解壓縮每個幀並將原始RGB幀放入內存。 這樣,時間就花在了I / O上,並將幀解碼為RGB。 但是,從長遠來看,對您來說更快的方法是先通過單個read
調用批量讀取一堆幀,然后稍后再使用它們。
read
方法允許您指定兩個元素的向量作為第二個輸入,以告訴MATLAB您要讀取的幀范圍。 例如,如果您想閱讀前10幀,請執行以下操作:
video = read(xyloObj, [1 10]);
video
是一個4維數組,其中第一維是幀的高度,第二維是寬度,第三維是顏色通道的數量(通常為3),第四維是幀號。 因此,如果要訪問第i
個幀,請執行以下操作:
frame = video(:,:,:,i);
另外,如果您調用了不帶第二個參數的read
,那么它將從頭到尾讀取所有幀。 因此,您也可以這樣做:
video = read(xyloObj);
在xylophone.mp4
文件(在我的計算機上)中,有141幀,並且在我的計算機上執行上述操作大約花費了13秒。 我的配置是Mac OS Yosemite 10.10.3,在Intel Core i7 2.3 GHz上運行具有16 GB RAM的MATLAB R2013a。 從我們之前討論的內容來看,這是有道理的,現在這些幀可以作為4D矩陣使用。
因此,可能可行的一件事是使用read
並只讀取所有幀而不循環。 如果那很慢,那么也許您可以一次每隔10或20幀讀取一次,處理這些幀,然后進行下一批處理。
for idx = 1 : 20 : nFrames
if idx + 20 > nFrames
endIndex = nFrames;
else
endIndex = idx + 20;
end
video = read(xyloObj, [idx endIndex-1]);
%// Continue processing
end
但是,如果您僅使用read
命令本身而沒有任何第二次輸入,則可以等待大約13秒左右,那完全可以。 除此之外,如果您真的想在以后使用這些框架,則始終可以使用save
框架save
並存儲在MAT文件中,以便於加載和以后使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.