2012-02-07 62 views
2

我已經編寫了一些代碼,用於導入視頻,並逐幀地將一些DCT係數形成圖像的特定區域,然後使用圖像輸出二進制文件(包含係數)單獨的功能。這在單獨執行時工作正常,但我試圖實現批處理版本的代碼,因爲我正在處理超過200個視頻文件。批處理視頻(Matlab) - 問題

然而,他們是一個問題,當它通過循環它每次輸出錯誤的文件。如果下一次迭代中的幀數較少,則寫入前一幀。我被告知我需要在運行之前初始化我的for循環。不過,我相信如何做到這一點,我認爲問題在於2nd for循環,但我不確定。

任何建議將不勝感激!

files = dir('Videos/*.mov'); 
for m = 1:numel(files);  
    readerobj = mmreader(files(m).name); 
    vidFrames = read(readerobj); 
    numFrames = get(readerobj, 'numberOfFrames'); 
    % Create a MATLAB movie struct from the video frames. 
    for k = 1 : numFrames 
     mov(k).cdata = vidFrames(:,:,:,k); 
     mov(k).colormap = []; 
    end 

    firstFrame = mov(1).cdata;  
    rect = [172,225,271,143;]; 
    numFrames = length(mov); 
    dctCoeff = zeros((10*10),numFrames); 
     for i = 1 : numFrames 
     frameImage = imcrop(mov(i).cdata, rect); 
     frameImage = rgb2gray(frameImage); 
     dctImage = dct2(frameImage); 
     dctImage = dctImage(1:10,1:10); 
     dctCoeff(:,i) = reshape(dctImage,1,(10*10)); 
     end 
     sRate = (1/29.9701)*1e7; 
     [status, error] = htk_write_mfc(files(m).name, size(dctCoeff,2),sRate,4*size(dctCoeff,1),9,dctCoeff); 
     status 
     error 
end 

回答

0

嘗試爲您加載每部電影設置mov[]。它將保留前一個mov的幀,並擴展該陣列以匹配最長的視頻。在你的循環之前for k = 1 : ...嘗試寫一行說mov = [];

1

只需卸下

numFrames = length(mov); 

,它應該正常工作!

我被告知,我需要初始化for循環我的一個運行

傑普之前!你沒有初始化mov

我也建議你把一個文件的代碼放到你從第一個循環調用的函數中。這是更好的代碼!

+0

現在工作正常!感謝您的幫助! – FredBones 2012-02-10 15:00:21

0

我不完全清楚你爲什麼要創建電影結構。您可以使用read()函數來讀取視頻文件中的特定幀。您可以嘗試下面的代碼:

files = dir('Videos/*.mov'); 
numDctCoeffs = 100; 
for m = 1:numel(files) 
    readerObj = mmreader(files(m).name); 
    numFrames = readerObj.NumberOfFrames; 
    rect = [172,225,271,143]; 
    sRate = (1/29.9701)*1e7; 
    dctCoeff = zeros(numDctCoeffs, numFrames); 
    for cnt = 1:numFrames 
     frameImage = imcrop(read(readerObj, cnt), rect); 
     frameImage = rgb2gray(frameImage); 
     dctImage = dct2(frameImage); 
     dctImage = dctImage(1:10,1:10); 
     dctCoeff(:, cnt) = dctImage(:); 
     [status, error] = htk_write_mfc(files(m).name, size(dctCoeff,2),sRate,4*size(dctCoeff,1),9,dctCoeff); 
    end 
end 

另外mmreader已被更新版本的MATLAB中的VideoReader替換。語法和名稱更改一樣。

希望這會有所幫助。

Dinesh