Why does Matlab close when I try to load a video file?

조회 수: 7 (최근 30일)
Dan Griffiths
Dan Griffiths 2015년 9월 11일
댓글: Walter Roberson 2015년 9월 14일
I'm a student working on a project in a lab studying brain injury. I have basic experience in Matlab, mostly doing Excel type work. I would like to use Matlab to watch our neural recording and video of the behavior simultaneously. I wrote a simple program and it worked for a short test file (~30 seconds long). However, when I try to load a sample experiment (~30 minutes long), Matlab closes without displaying and error message. Any idea what would cause this error?
I'm guessing that it is because of the size of the file. It's .mp4 at 1280x960 at 29.97fps RGB24. I tried to cut the resolution in half and convert to gray scale but I was unsuccessful. How do I convert the video to a lower resolution 8bit gray scale video? My basic code is below. Please let me know if you have any questions. Thank you for help!
%Load Data (.CSV file exported from FAST ANALYSIS
[FileName1,PathName,~] = uigetfile('.csv','Please load .CSV file exported from FAST ANALYSIS');
addpath(PathName);
Data = csvread(FileName1);
Data(1:7,:) = [];
clear PathName
%Create TIME
[Frame,~] = size(Data); %FRAME = number of data points (length of DATA)
RecordingFrequency = 4; %Recording at 4Hz... change if FREQUENCY changes
Duration = Frame/RecordingFrequency;
Time = 0:0.25:Duration; %Create TIME
Time(Frame) = []; %Delete last FRAME (trim vectors to the same length)
Time = Time'; %TRANSPOSE TIME (ROW to COLUMN VECTOR)
clear RecordingFrequency n Duration
%Create FILE VARIABLES
TTL = Data(:,1);
Ch1 = Data(:,2);
Ch2 = Data(:,3);
Ch3 = Data(:,4);
Ch4 = Data(:,5);
%Ch13 = Data(:,6);
%Ch24 = Data(:,7);
%Construct a VideoReader object
[FileName2,PathName,~] = uigetfile('.mp4','Please load BEHAVIOR VIDEO file');
addpath(PathName);
vidObj = VideoReader(FileName2);
clear PathName
%Determine the height and width of the frames
vidHeight = vidObj.Height;
vidWidth = vidObj.Width;
%Create a MATLAB movie structure array, s.
s = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),'colormap',[]);
%Read one frame at a time using readFrame until the end of the file is reached.
%Append data from each video frame to the structure array.
k = 1;
while hasFrame(vidObj)
s(k).cdata = readFrame(vidObj);
k = k+1;
end
%CONVERT DATA into SPLINE (UP SAMPLE from 4Hz to 29.97Hz)
TotalFrames = vidObj.FrameRate * vidObj.CurrentTime;
FrameLength = 1:Frame;
xx = 0:1/vidObj.FrameRate:TotalFrames;
Times = spline(FrameLength,Time,xx);
Times = Times';
Ch1s = spline(FrameLength,Ch1,xx);
Ch1s = Ch1s';
Ch2s = spline(FrameLength,Ch2,xx);
Ch2s = Ch2s';
Ch3s = spline(FrameLength,Ch3,xx);
Ch3s = Ch3s';
Ch4s = spline(FrameLength,Ch4,xx);
Ch4s = Ch4s';
clear xx
%CREATE PLOT WINDOW
xmin = 1; xmax = 251;
ymin = 0; ymax = 50;
%KEYPRESS == 0
val = -1;
figure('Name','The Amazing Analyzer by Dan','NumberTitle','off')
%PLOT FILE DATA
while val ~= 13;
clf
str1 = 'Hello and welcome to The Amazing Analyzer by Dan!';
str2 = 'Quick Start Guide';
str3 = 'Play forward = Right Arrow';
str4 = 'Play backward = Left Arrow';
str5 = 'Advance 10 frames = Up Arrow';
str6 = 'Go back 10 frames = Down Arrow';
str7 = 'Pause = Space Bar';
str8 = 'Enter = End Session';
str9 = 'Good luck!';
text(1,10,str1)
text(1,8,str2)
text(2,7,str3)
text(2,6,str4)
text(2,5,str5)
text(2,4,str6)
text(2,3,str7)
text(2,2,str8)
text(4,1,str9)
axis([0 10 0 12])
axis off
if val == -1; %PAUSE to START the GUI
k = waitforbuttonpress;
end
%Get KEYPRESS value
f=gcf;
val=double(get(f,'CurrentCharacter'));
%PLAYBACK BUTTONS
if val == 28; %LEFT ARROW - PLAY BACKWARDS
if xmin > 1;
xmin = xmin-1;
xmax = xmax-1;
end
end
if val == 29; %RIGHT ARROW - PLAY FORWARD
if xmax < TotalFrames;
xmin = xmin+1;
xmax = xmax+1; %ADD statement to prevent going past the end of the vector
end
end
if val == 30; %UP ARROW - ADVANCE 10 FRAMES
if xmax < TotalFrames-10;
xmin = xmin+10;
xmax = xmax+10; %ADD statement to prevent going past the end of the vector
end
end
if val == 31; %DOWN ARROW - GO BACK 10 FRAMES
if xmin > 10;
xmin = xmin-10;
xmax = xmax-10;
end
end
xavg1 = (xmin+xmax)/2;
xavg2 = (Time(xmin,1)+Time(xmax,1))/2;
y(1:50) = xavg2;
x = 1:1:50;
%SHOW IMAGE (TOP) & PLOT DATA (BOTTOM)
subplot(2,1,1);
image(s(xavg1).cdata)
title(FileName2)
axis off
subplot(2,1,2)
plot (Times,Ch1s,'r')
hold on
plot (Times,Ch2s,'b')
plot (Times,Ch3s,'m')
plot (Times,Ch4s,'c')
plot(y,x,'k--')
title(FileName1)
ylabel('Glutamate (mM)')
xlabel('Frame')
axis([Time(xmin,1) Time(xmax,1) ymin ymax])
%PLAYBACK control
if val == 28; %LEFT ARROW - PLAY BACKWARDS
pause(1/vidObj.FrameRate);
end
if val == 29; %RIGHT ARROW - PLAY FORWARD
pause(1/vidObj.FrameRate);
end
if val == 30; %UP ARROW - ADVANCE 10 FRAMES
pause;
end
if val == 31; %DOWN ARROW - GO BACK 10 FRAMES
pause;
end
if val == 32; %SPACE BAR - GO BACK 10 FRAMES
pause;
end
if xmin == 1; %PREVENT OVER RE-WINDING
pause;
end
if xmax == TotalFrames; %PREVENT OVER PLAYING
pause;
end
end
beep; pause (0.5); beep;
  댓글 수: 1
Walter Roberson
Walter Roberson 2015년 9월 11일
How big is that full file? My estimate is that it could be up to 63 gigabytes uncompressed.
How much memory do you have, and are you using 32 bit or 64 bit MATLAB?

댓글을 달려면 로그인하십시오.

채택된 답변

Dinesh Iyer
Dinesh Iyer 2015년 9월 14일
Hi,
It looks you are reading in all the frames in the video into MATLAB albeit one frame at a time. This is most likely the cause of MATLAB shutting down.
The only workaround that I can suggest is to read a frame from the video as and when you need it instead of loading the entire video into memory.
Dinesh
  댓글 수: 2
Dan Griffiths
Dan Griffiths 2015년 9월 14일
I tried loading and displaying one frame at a time... however, it plays the file way to slow. I still think I need to convert the file to grey scale and reduce the resolution... I'm having trouble getting this to work.
obj = VideoReader('xylophone.mp4');
nFrames = obj.NumberOfFrames;
vidHeight = obj.Height;
vidWidth = obj.Width;
mov(1:nFrames) =struct('cdata',zeros(vidHeight,vidWidth,1,'uint8'),...
'colormap',[]);
% Read one frame at a time.
for k = 1 : nFrames
mov(k).cdata =rgb2gray( read(obj,k));
end
implay(mov);
The above code converts it to grey scale when called using "implay" but displays it as yellow and blue when shown using "image" in the figure window. Any idea why? Any tips for how to compress a video file in Matlab?
Thanks, Dan
Walter Roberson
Walter Roberson 2015년 9월 14일
colormap(gray(256))
With the movie parameters you gave above, after conversion to gray, you would have about 21 Gb of movie data in memory simultaneously.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Convert Image Type에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by