MATLAB Answers

0

Video recording waiting for start

Asked by Marcel Liphardt on 4 Aug 2018
Latest activity Edited by Marcel Liphardt on 21 Aug 2018
So I am using Matlab 2017b and below code to record two videos from two gige vision cameras. And the problem that I couldn't find on the Internet or in the Matlab forums is that the cameras always record a video with a duration of two minutes and 30 seconds(2:30) erverytime I start the recording procedure. Am I missing something or doing something wrong here? Once the duration hits the 2:30, my preview window doesn't stop but the text filed, which shows: "Logging image xxx" then suddenly turns into: "Waiting for start" again. This topic is really urgent to me because I really need to record videos that are way longer than two minutes.
function varargout = aufnehmen_speichern(varargin)
% AUFNEHMEN_SPEICHERN MATLAB code for aufnehmen_speichern.fig
% AUFNEHMEN_SPEICHERN, by itself, creates a new AUFNEHMEN_SPEICHERN or raises the existing
% singleton*.
%
% H = AUFNEHMEN_SPEICHERN returns the handle to a new AUFNEHMEN_SPEICHERN or the handle to
% the existing singleton*.
%
% AUFNEHMEN_SPEICHERN('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in AUFNEHMEN_SPEICHERN.M with the given input arguments.
%
% AUFNEHMEN_SPEICHERN('Property','Value',...) creates a new AUFNEHMEN_SPEICHERN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before aufnehmen_speichern_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% save. All inputs are passed to aufnehmen_speichern_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help aufnehmen_speichern
% Last Modified by GUIDE v2.5 16-Apr-2018 13:34:59
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @aufnehmen_speichern_OpeningFcn, ...
'gui_OutputFcn', @aufnehmen_speichern_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before aufnehmen_speichern is made visible.
function aufnehmen_speichern_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to aufnehmen_speichern (see VARARGIN)
% Choose default command line output for aufnehmen_speichern
handles.output = hObject;
hForm = gcf;
h = waitbar(0,'Initializing...');
set(0, 'CurrentFigure', h);
set(0, 'CurrentFigure', hForm); %Ohne diese Zeilen kann man aufnehmen_speichern.m nicht von der main aus starten
clc;
imaqreset;
handles.vid1 = videoinput('gige', 1,'Mono8');
handles.vid2 = videoinput('gige', 2,'Mono8');
waitbar(0.20,h,'Setting Videoinput...');
src1 = getselectedsource(handles.vid1);
src2 = getselectedsource(handles.vid2);
waitbar(0.35,h,'Setting Resources...');
src1.AcquisitionFrameRateAbs = 30.000300003;
src2.AcquisitionFrameRateAbs = 30.000300003;
set(handles.vid1,'FramesPerTrigger',Inf);
set(handles.vid2,'FramesPerTrigger',Inf);
waitbar(0.45,h,'Setting FramesPerTrigger...');
triggerconfig(handles.vid1,'hardware','DeviceSpecific','DeviceSpecific');
triggerconfig(handles.vid2,'hardware','DeviceSpecific','DeviceSpecific');
set(handles.vid1,'TriggerRepeat',inf);
set(handles.vid2,'TriggerRepeat',inf);
waitbar(0.6,h,'Setting Triggerconfig...');
src1.TriggerSelector = 'FrameStart';
src2.TriggerSelector = 'FrameStart';
src1.TriggerSource = 'Line1';
src2.TriggerSource = 'Line1';
waitbar(0.75,h,'Setting TriggerActivation...');
src1.TriggerActivation = 'FallingEdge';
src2.TriggerActivation = 'FallingEdge';
src1.TriggerMode = 'on';
src2.TriggerMode = 'on';
handles.vid1.LoggingMode = 'disk';
handles.vid2.LoggingMode = 'disk';
waitbar(0.80,h,'Setting Image Handle...');
vidRes = handles.vid1.VideoResolution;
imWidth = vidRes(1);
imHeight = vidRes(2);
nBands = handles.vid1.NumberOfBands;
handles.hImage1= image(zeros(imHeight,imWidth,nBands));
setappdata(handles.hImage1,'UpdatePreviewWindowFcn',@mypreview_fcn);
setappdata(handles.hImage1,'HandleToTimestampLabel',handles.text1);
setappdata(handles.hImage1,'HandleToResolutionLabel',handles.text2);
setappdata(handles.hImage1,'HandleToStatusLabel',handles.text3);
setappdata(handles.hImage1,'HandleToFrameRateLabel',handles.text4);
set(handles.save,'Enable','off');
set(handles.restart,'Enable','off');
preview(handles.vid1, handles.hImage1);
waitbar(1,h,'Done...');
delete(h);
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes aufnehmen_speichern wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = aufnehmen_speichern_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
set(gcf, 'units', 'normalized', 'outerposition', [0 0 1 1]);
% --- Executes on button press in back.
function back_Callback(hObject, eventdata, handles)
% hObject handle to back (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
delete(handles.vid1);
clear handles.vid1;
delete(handles.vid2);
clear handles.vid2;
close;
main;
% --- Executes on button press in exit.
function exit_Callback(hObject, eventdata, handles)
% hObject handle to exit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
delete(handles.vid1);
clear handles.vid1;
delete(handles.vid2);
clear handles.vid2;
close;
% --- Executes on button press in create_files.
function create_files_Callback(hObject, eventdata, handles)
% hObject handle to create_files (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.create_files,'Enable','off');
set(handles.back,'Enable','off');
set(handles.exit,'Enable','off');
time = datetime('now','TimeZone','local','Format','dd-MM-yyyy''-T-''HH-mm-ss');
setT = char(time);
[file1,path] = uiputfile(['F:\Aufnahmen\test\' 'Hummel-01_',setT,'_links.avi'],'Select the directory for the left Grayscale AVI');
if(isequal(file1,0) || isequal(path,0))
set(handles.create_files,'Enable','on');
set(handles.back,'Enable','on');
set(handles.exit,'Enable','on');
return;
end
file2 = strrep(file1,'links','rechts');
%diskLogger1 = VideoWriter('D:\Matlab Sciebo\Hummeln 2017\Kalibrierung\Test\links01.avi', 'Grayscale AVI');
%diskLogger2 = VideoWriter('D:\Matlab Sciebo\Hummeln 2017\Kalibrierung\Test\rechts01.avi', 'Grayscale AVI');
disk1 = VideoWriter(fullfile(path,file1), 'Grayscale AVI');
disk2 = VideoWriter(fullfile(path,file2), 'Grayscale AVI');
handles.vid1.DiskLogger = disk1;
handles.vid2.DiskLogger = disk2;
start(handles.vid1);
start(handles.vid2);
set(handles.save,'Enable','on');
% --- Executes on button press in save.
function save_Callback(hObject, eventdata, handles)
% hObject handle to save (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
stoppreview(handles.vid1);
stoppreview(handles.vid2);
while(handles.vid1.FramesAcquired ~= handles.vid1.DiskLoggerFrameCount)
pause(.1);
end
stop(handles.vid1);
while(handles.vid2.FramesAcquired ~= handles.vid2.DiskLoggerFrameCount)
pause(.1);
end
stop(handles.vid2);
set(handles.save,'Enable','off');
set(handles.restart,'Enable','on');
set(handles.back,'Enable','on');
set(handles.exit,'Enable','on');
% --- Executes on button press in restart.
function restart_Callback(hObject, eventdata, handles)
% hObject handle to restart (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if(isrunning(handles.vid1) == 0 && isrunning(handles.vid2) == 0)
choice = questdlg({'Do you really want to restart the acquisition?'},...
'Warning',...
'Yes','No','No');
switch choice
case 'Yes'
set(handles.restart,'Enable','off');
set(handles.create_files,'Enable','on');
set(handles.back,'Enable','on');
set(handles.exit,'Enable','on');
preview(handles.vid1, handles.hImage1);
case 'No'
return;
end
end
function mypreview_fcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
tst = eventdata.Timestamp;
rsl = eventdata.Resolution;
sts = eventdata.Status;
frr = eventdata.FrameRate;
ts1 = getappdata(handles,'HandleToTimestampLabel');
rs1 = getappdata(handles,'HandleToResolutionLabel');
st1 = getappdata(handles,'HandleToStatusLabel');
fr1 = getappdata(handles,'HandleToFrameRateLabel');
ts1.String = tst;
rs1.String = rsl;
st1.String = sts;
fr1.String = frr;
handles.CData = eventdata.Data;

  0 Comments

Sign in to comment.

2 Answers

Answer by Han Du
on 9 Aug 2018

There are multiple potential causes of this issue.
What is the memory usage after acquiring data for 2:30 minutes? Sometimes the memory usage can be very high if acquired images haven't been logged on disk which can even cause MATLAB freeze.
You are using hardware trigger. Is the trigger source still providing signal after 2:30 minutes?
It should be easier to troubleshoot the issue by extracting the code for acquiring images from the gui.

  1 Comment

Right when the recorded time on the external hard drive reaches the 2:30, Matlab throws this error:
Error using asyncio.MessageHandler/onError (line 24)
Error using asyncio.MessageHandler/onError (line 24)
Error event occurred at 15:01:37 for video input object: Mono8-gige-2.
gige: Unexpected error logging to disk:
Channel must be open before writing data.
gige: Unexpected error logging to disk:
Channel must be open before writing data.
Error event occurred at 15:01:37 for video input object: Mono8-gige-1.
gige: Unexpected error logging to disk:
Channel must be open before writing data.
gige: Unexpected error logging to disk:
Channel must be open before writing data.
And I could track the issue down to the fact that my external 4TB hard drive shipped with the FAT32 format and not NTFS.

Sign in to comment.


Answer by Marcel Liphardt on 21 Aug 2018
Edited by Marcel Liphardt on 21 Aug 2018

Ok, but now the group I am working with tells me that sometimes the two videos they record don‘t have the same duration. They told me that they always press the „restart“ button which calls the restart_Callback.
And it sometimes happens to the left camera and sometimes to the right as well as the time when one of the recordings suddenly stops seems to be different, too.
Another error that also occurs is that one video plays at the expected 30 FPS and the other video plays way faster than the other.
Is there anything that I did wrong?

  0 Comments

Sign in to comment.