Изображение истории движения в Matlab

Я работаю над проектом о распознавании действий с использованием изображений истории движения в Matlab. Я новичок в этой области. Я сделал вычитание фона, используя метод разности кадров, чтобы получить изображения, на которых есть только движущийся человек. Теперь я хочу вычислить MHI. Я нашел следующий код для MHI. Я не понял, что такое fg{1} и как его использовать. Любая помощь будет оценена. Спасибо.

vid= VideoReader('PS7A1P1T1.avi');
n = vid.NumberOfFrames; 

fg = cell(1, n);

 for i = 1:n
      frame = read(vid,i); 
      frame = rgb2gray(frame);
      fg{i} = frame;
 end
%---------------------------------------------------------------
%background subtraction using frame differencing method 
thresh = 25;            
bg = fg{1};           % read in 1st frame as background frame 
% ----------------------- set frame size variables ----------------------- 
fr_size = size(bg);              
width = fr_size(2); 
height = fr_size(1); 
% --------------------- process frames ----------------------------------- 
for i = 2:n 

    fr = fg{i};       % read in frame 

    fr_diff = abs(double(fr) - double(bg));  % cast operands as double to avoid negative overflow 

    for j=1:width                 % if fr_diff > thresh pixel in foreground 
        for k=1:height 
            if ((fr_diff(k,j) > thresh)) 
                fg {i}(k,j) = fr(k,j); 
            else 
                fg {i}(k,j) = 0; 
            end 
        end 
    end 

    bg = fr; 

    imshow(fg{i}) 

end 

out = MHI(fg);

//------------------------------------------------------- функция MHI = MHI(fg)

% Initialize the output, MHI a.k.a. H(x,y,t,T)
MHI = fg;

% Define MHI parameter T
T = 15; % # of frames being considered; maximal value of MHI.

% Load the first frame
frame1 = fg{1};

% Get dimensions of the frames
[y_max x_max] = size(frame1);

% Compute H(x,y,1,T) (the first MHI)
MHI{1} = fg{1} .* T;

% Start global loop for each frame
for frameIndex = 2:length(fg)

    %Load current frame from image cell
    frame = fg{frameIndex};

    % Begin looping through each point
    for y = 1:y_max
        for x = 1:x_max
            if (frame(y,x) == 255)
                MHI{frameIndex}(y,x) = T;
            else
                if (MHI{frameIndex-1}(y,x) > 1)
                    MHI{frameIndex}(y,x) = MHI{frameIndex-1}(y,x) - 1;
                else
                    MHI{frameIndex}(y,x) = 0;
                end
            end
        end
    end
end

person Hind Fawzi    schedule 28.12.2015    source источник
comment
Если я помог, подумайте о том, чтобы принять мой ответ, чтобы сообщить сообществу, что вам больше не нужна помощь. Удачи   -  person rayryeng    schedule 28.12.2015


Ответы (1)


fg{1}, скорее всего, является первым кадром видео в градациях серого. Учитывая ваши комментарии, вы используете класс VideoReader для чтения во фреймах. Таким образом, считывайте каждый кадр отдельно, преобразуйте в оттенки серого, а затем размещайте в ячейке массива ячеек. Когда вы закончите, вызовите скрипт.

Вот код, измененный из ваших комментариев, чтобы удовлетворить эту задачу:

vid = VideoReader('PS7A1P2T1.avi');
n = vid.NumberOfFrames; 

fg = cell(1, n);

for i = 1:n
   frame = read(vid,i); 
   frame = rgb2gray(frame);
   fg{i} = frame;
end

Затем вы можете вызвать сценарий MHI:

out = MHI(fg);
person rayryeng    schedule 28.12.2015
comment
Спасибо вам большое за ваш ответ. Я читаю видео, используя следующий код. Я не использовал никакую матрицу. Кажется, я делаю это неправильно? vid= VideoReader('PS7A1P2T1.avi'); OutVideoDir = 'ПОСЛЕДОВАТЕЛЬНОСТИ ИЗОБРАЖЕНИЙ'; mkdir(OutVideoDir); numFrames = vid.NumberOfFrames; n=количество кадров; для i = 1: n кадров = чтение (vid, i); кадры = rgb2gray (кадры); baseFileName = sprintf('%d.jpg', i); % напр. 1.jpg fullFileName = fullfile(OutVideoDir, baseFileName); imwrite(frames, fullFileName); конец - person Hind Fawzi; 28.12.2015
comment
Да, вы используете VideoReader. Я не знал, что вы использовали этот интерфейс. Я изменю свой ответ позже, чтобы исправить это. Я не перед компьютером в настоящее время. - person rayryeng; 28.12.2015
comment
Хорошо, действительно большое спасибо за вашу помощь. Ценить это. - person Hind Fawzi; 28.12.2015
comment
Я получаю эту ошибку в коде фонового вычитания: преобразование в ячейку из двойного невозможно. Ошибка в Action_Recognition (строка 85) fg (k,j) = 0; - person Hind Fawzi; 28.12.2015
comment
Я использую код в этой ссылке для вычитания фона: read.pudn.com/downloads166/sourcecode/math/765783/ - person Hind Fawzi; 28.12.2015
comment
fg представляет собой массив ячеек кадров. Мне придется продолжить расследование, потому что я не знаю, как вы используете код, который вы мне привязали. Вот почему вы должны поместить весь код, который вы пробовали. Это предотвращает движение вперед и назад, как то, что мы делаем. - person rayryeng; 28.12.2015
comment
Хорошо, но как я могу поместить весь код. Это длинновато, а здесь я могу поставить только до 600 символов? - person Hind Fawzi; 29.12.2015
comment
Отредактируйте свой вопрос. Не размещайте код в комментариях. На самом деле, это обескураживает. - person rayryeng; 29.12.2015
comment
В порядке. Спасибо. Я исправил это сейчас, но когда я запускаю код, я получаю неточные результаты для изображений вычитания фона, они должны быть бинарными изображениями, но это не так. И еще один момент, как я могу отобразить изображение MHI? Я пробовал imshow(out) , но получаю ошибки. - person Hind Fawzi; 29.12.2015
comment
@HindFawzi код, который вы написали для вычитания фона, не сохраняет изображения в двоичном виде, поэтому я не уверен, чего вы хотите. Кроме того, изображение MHI представляет собой массив ячеек. Вы хотите отображать каждый кадр... что-то вроде imshow(out{1},[]); для отображения первого изображения MHI будет работать. Я не могу начать модифицировать ваш код вычитания фона, потому что вы говорите, что вывод двоичный, но ожидаемый результат явно double. - person rayryeng; 29.12.2015
comment
Мне нужно, чтобы на изображении был только движущийся человек, поэтому я применил метод разности кадров, так как он прост и удобен. Двоичное изображение является результатом различия кадров и должно быть черно-белым, а не изображением в градациях серого, верно? Пожалуйста, поправьте меня, если я ошибаюсь; как я уже сказал, я новичок в этой области. - person Hind Fawzi; 29.12.2015