2016-12-09 48 views
1

我在視頻幀上進行基於平移顏色的圖像分割。 這是我的代碼:MATLAB:如果他們花費太多時間,我該如何避免iamresize和VideoReader?

while hasFrame(v) 
    if k == 1 
     s(k).cdata = readFrame(v); 
     a = s(k).cdata; 
     I = imresize(a,[50,50]); 
     [means, Ims, Nms] = Ms(I,bw); %Mean Shift on first frame 
     Ims = im2uint8(Ims); 
     s(k).cdata = Ims; 
    else 
     s(k).cdata = readFrame(v); 
     a = s(k).cdata; 
     I = imresize(a,[50,50]); 
     [Ims,data2cluster]= MeanShiftCluster2(I,means); % simple segmentation based on norm using means of first frame    
     Ims = im2uint8(Ims); 
     Ims = imresize(Ims,[500,720]); 
     s(k).cdata = Ims; 
    end 

    k=k+1; 
end 

我送爲平均換檔執行第一幀,然後使用相同的所得裝置,用於所有其它幀來計算歐幾里德距離(我的幀具有輕微的變化)的基礎上它們各自的集羣。

問題: Profiler告訴iamresize和VideoReader函數執行時間太長。有什麼替代品可以使用?

回答

0

imresize可能是您處理中最慢的一步。 但這裏有幾個想法來加快這個過程。

imresize做什麼叫插值。這可能是一個緩慢的過程,但速度取決於您想要的輸出質量。 matlab中的默認值是bicubic。您可以嘗試bilinearneareste.g

[...] = imresize(...,'nearest'); 

在我的personnal實驗,我還發現,imresize等同的功能有一定的開銷。您可以通過只爲所有視頻幀調用一次函數來「更快」一些。你需要有足夠的內存來做到這一點。假設你有一個3d矩陣的所有幀dataMovie。在構建這個矩陣時,預分配(通過獲取幀的數量)將有助於獲得一些速度!

k = 0.5; % scaling parameter 
tform = affine2d([k 0 0;0 k 0;0 0 1]); 
dataTform = imwarp(dataMovie,tform,'nearest'); 

然後,將處理應用到調整大小的電影逐幀。您還可以提供插值類型nearsetlinearbicubic

如果您正在製作彩色電影,則需要將所有幀的3個顏色層堆疊在一起,然後使用適當的索引將其復原。

相關問題