2012-02-07 20 views
2

ビデオをインポートし、フレーム単位で特定の領域のDCT係数を取り込むコードを書きました。別の機能。これを個別に行うとうまくいきますが、私は200以上のビデオファイルで作業しているので、コードのバッチバージョンを実装しようとしました。バッチ処理ビデオ(Matlab) - 問題

しかし、ループを通過するたびに間違ったファイルが出力されるという問題があります。次の反復におけるフレームの数が少ないフレームを有する場合、それは前のフレームに書き込む。私はそれが実行される前に私のforループの一つを初期化する必要があると言われました。しかし、私はこれを行う方法は確信している、私は問題が2番目のループにあると思うが、私はよく分からない。

ご意見をいただければ幸いです!

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); 

を削除し、それが正常に動作する必要があります!

私は、私はそれが

JUPを実行する前に、ループのための私の1を初期化する必要があると言われました! movを初期化していません。

1つのファイルのコードを、最初のループから呼び出す関数に入れることをお勧めします。それは良いコードです!

+0

今すぐ動作します!あなたに助けてくれてありがとう! – FredBones

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 

さらに、新しいバージョンのMATLABではmmreaderがVideoReaderに置き換えられました。構文は同じ名前変更だけです。

これが役に立ちます。

Dinesh