2012-02-07 68 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