簡體   English   中英

將視頻轉換為圖像序列MATLAB

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM