Пакетная обработка видео (Matlab) - выпуск - PullRequest
2 голосов
/ 07 февраля 2012

Я написал некоторый код, который импортирует видео и принимает некоторые коэффициенты DCT из определенной области изображения кадр за кадром, а затем выводит двоичный файл (содержащий коэффициенты), используя отдельную функцию. Это прекрасно работает, когда я делаю это по отдельности, но я попытался реализовать пакетную версию кода, поскольку я работаю с более чем 200 видеофайлами.

Однако их проблема заключается в том, что при прохождении цикла каждый раз выводится неверный файл. Если количество кадров в следующей итерации имеет меньше кадров, оно записывает в предыдущие кадры. Мне сказали, что мне нужно инициализировать один из моих циклов for, прежде чем он запустится. Однако я уверен, как это сделать, я думаю, что проблема заключается во втором цикле 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

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Просто удалите

numFrames = length(mov);

и должно работать нормально!

Мне сказали, что мне нужно инициализировать один из циклов for, прежде чем он запустится

Юп! Вы не инициализируете mov.

Я бы также порекомендовал вам поместить код для одного файла в функцию, которую вы вызываете из первого цикла. Это лучший код!

0 голосов
/ 25 июня 2015

Мне не совсем понятно, почему вы создаете структуру фильма. Вы можете использовать функцию 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. Синтаксис такой же, только смена имени.

Надеюсь, это поможет.

Динеш

0 голосов
/ 07 февраля 2012

Попробуйте установить mov на [] для каждого загружаемого фильма.Он сохранит кадры из предыдущего mov и расширит этот массив, чтобы соответствовать вашему самому длинному видео.Перед циклом for k = 1 : ... попробуйте написать строку с надписью mov = [];.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...