2012-07-29 4 views
0

У меня проблема. Моя проблема в том, что я хочу разделить все кадры изображений с AVI-видео. Прежде всего, я использовал функцию aviread(), которая дает мне ошибку в памяти. Затем из онлайн-справки я использовал функции mmreader() и read() для разделения кадров изображения, но проблема в том, что считываемые изображения из функции read() не могут быть показаны с помощью функции imshow(). У меня есть следующий фрагмент кода,Разделение видео на изображения в matlab

function test() 
    A='G:\ims\avi\nh.avi'; 
    B=mmreader(A); 
    ims=read(B,[2000 2200]); 
    figure(1),imshow(ims(1)); 
end 

Я надеялся, что этот код покажет первый кадр изображения, но это не так. В этом коде я свободен от ошибок в памяти, потому что я читаю только 200 кадров. Но проблема все еще остается, когда я пытаюсь прочитать все фреймы. Таким образом, в основном у меня есть следующие две проблемы:

  1. Как я могу избавиться от проблемы с памятью, используя mmreader() и read()?
  2. Почему не imshow() не показывает рамку изображения?
+0

какая версия MATLAB вы используете? – Amro

+0

Это был Matlab 7 –

ответ

1

Чтобы избавиться от отказа от ошибки памяти рассматривать чтение в одном кадре внутри цикла, как показано в документации mmreader (doc mmreader):

for k = 2000 : 2200 
    ims = read(B, k); 
end 

Причина imshow не работает является то, что значение, возвращаемое read(...), равно Высота x Ширина x Цвета x NumFrames Где Высота - это высота видео, Ширина - это ширина видео, Colors - количество цветов (обычно 3), а NumFrames - количество кадров, которые вы читаете.

Для отображения первого использования кадров:

imshow(ims(:,:,:,1)); 
0

Если вы хотите реализовать базовый видеоплеер, вот пример:

mov = VideoReader('xylophone.mpg'); %# use mmreader on older versions 
for i=1:mov.NumberOfFrames 
    img = read(mov,i); 
    imshow(img) 
    drawnow 
end 

Это читает один кадр за один раз, и дисплеи используя IMSHOW. Обратите внимание, что требуется вызвать DRAWNOW (или приостановить с небольшим значением), чтобы очередь событий GUI была сброшена.

Если вам интересно, я показал в графическом окне previous answer графический интерфейс для просмотра фреймов видеофайла.

0

Это разбивает видео на кадры без необходимости дополнительных кодеков:

clc; 
close all; 

% Open an sample avi file 

filename = '.\003.AVI'; 
mov = MMREADER(filename); 

% Output folder 

outputFolder = fullfile(cd, 'frames'); 
if ~exist(outputFolder, 'dir') 
    mkdir(outputFolder); 
end 

%getting no of frames 

numberOfFrames = mov.NumberOfFrames; 
numberOfFramesWritten = 0; 
for frame = 1 : numberOfFrames  
    thisFrame = read(mov, frame); 
    outputBaseFileName = sprintf('%3.3d.png', frame); 
    outputFullFileName = fullfile(outputFolder, outputBaseFileName); 
    imwrite(thisFrame, outputFullFileName, 'png'); 
    progressIndication = sprintf('Wrote frame %4d of %d.', frame,numberOfFrames); 
    disp(progressIndication); 
    numberOfFramesWritten = numberOfFramesWritten + 1; 
end 
progressIndication = sprintf('Wrote %d frames to folder "%s"',numberOfFramesWritten, outputFolder); 
disp(progressIndication); 
+1

Пожалуйста, объясните ответ. Иногда полезно объяснить ответ с некоторым кодом в ответ только потому, что ссылки могут стать недействительными в будущем – VendettaDroid

0

Вот что я использую, чтобы разделить видео и сливают в анимированные GIF-х. Я уверен, что вы можете приспособить его к тому, что вам нравится. Он полностью основан на фрагментах кода из справки MATLAB.

function [ startframe, endframe ] = catgif(inputvideoname, outputfilename,... 
startframe, endframe, preview) 

InputVideo = VideoReader(inputvideoname); 
filename = outputfilename; 

if (endframe > InputVideo.NumberOfFrames) 
    endframe = InputVideo.NumberOfFrames;  
end 

figure(1) 
for ii = 1:endframe 
    if (ii >= startframe) 
     img = read(InputVideo,ii); 

     %Resize or rotate as appropriate. 
     %img = imresize(imrotate(img, -90),0.5, 'bicubic'); 
     img = imresize(img,0.5, 'bicubic'); 

     imshow(img,'Border','tight'); 
     drawnow 
     frame = getframe(1); 
     im = frame2im(frame); 
     [imind,cm] = rgb2ind(im,256); 
     if ~strcmp(preview, 'yes') 
      if ii == startframe; 
       imwrite(imind,cm,filename,'gif', 'DelayTime', 0, 'Loopcount',inf); 
      else 
       imwrite(imind,cm,filename,'gif','DelayTime', 0, 'WriteMode','append'); 
      end 
     end 
    end 
end 
Смежные вопросы