В этом примере показано, как отображать несколько видеопотоков в пользовательском графическом интерфейсе пользователя (GUI).
При работе над проектом, включающим обработку видео, мы часто сталкиваемся с созданием пользовательского интерфейса. Он может потребоваться для визуализации и/или демонстрации влияния наших алгоритмов на входной видеопоток. В этом примере показано, как создать окно фигуры с двумя осями для отображения двух видеопотоков. Здесь также показано, как настроить кнопки и соответствующие им обратные вызовы.
Пример написан как функция с основным корпусом вверху и вспомогательными подпрограммами в виде вложенных функций.
function VideoInCustomGUIExample()
Инициализируйте устройство чтения видео.
videoSrc = vision.VideoFileReader('vipmen.avi', 'ImageColorSpace', 'Intensity');
Создайте окно фигуры и две оси для отображения входного видео и обработанного видео.
[hFig, hAxes] = createFigureAndAxes();

Добавление кнопок для управления воспроизведением видео.
insertButtons(hFig, hAxes, videoSrc);

Теперь, когда графический интерфейс пользователя создан, мы можем нажать кнопку воспроизведения, чтобы запустить основной цикл обработки видео, определенный в getAndProcessFrame функции, перечисленные ниже.
% Initialize the display with the first frame of the video frame = getAndProcessFrame(videoSrc, 0); % Display input video frame on axis showFrameOnAxis(hAxes.axis1, frame); showFrameOnAxis(hAxes.axis2, zeros(size(frame)+60,'uint8'));

При этом каждый видеокадр центрируется в поле оси. Если размер оси больше размера кадра, границы видеокадра дополняются цветом фона. Если размер оси меньше размера рамки, добавляются полосы прокрутки.
Создайте окно фигуры и две оси с заголовками для отображения двух видеороликов.
function [hFig, hAxes] = createFigureAndAxes() % Close figure opened by last run figTag = 'CVST_VideoOnAxis_9804532'; close(findobj('tag',figTag)); % Create new figure hFig = figure('numbertitle', 'off', ... 'name', 'Video In Custom GUI', ... 'menubar','none', ... 'toolbar','none', ... 'resize', 'on', ... 'tag',figTag, ... 'renderer','painters', ... 'position',[680 678 480 240],... 'HandleVisibility','callback'); % hide the handle to prevent unintended modifications of our custom UI % Create axes and titles hAxes.axis1 = createPanelAxisTitle(hFig,[0.1 0.2 0.36 0.6],'Original Video'); % [X Y W H] hAxes.axis2 = createPanelAxisTitle(hFig,[0.5 0.2 0.36 0.6],'Rotated Video'); end
Ось создается на объекте-контейнере uipanel. Это обеспечивает больший контроль над компоновкой GUI. Название видео создается с помощью uiccontrol.
function hAxis = createPanelAxisTitle(hFig, pos, axisTitle) % Create panel hPanel = uipanel('parent',hFig,'Position',pos,'Units','Normalized'); % Create axis hAxis = axes('position',[0 0 1 1],'Parent',hPanel); hAxis.XTick = []; hAxis.YTick = []; hAxis.XColor = [1 1 1]; hAxis.YColor = [1 1 1]; % Set video title using uicontrol. uicontrol is used so that text % can be positioned in the context of the figure, not the axis. titlePos = [pos(1)+0.02 pos(2)+pos(3)+0.3 0.3 0.07]; uicontrol('style','text',... 'String', axisTitle,... 'Units','Normalized',... 'Parent',hFig,'Position', titlePos,... 'BackgroundColor',hFig.Color); end
Вставьте кнопки для воспроизведения, приостановите видео.
function insertButtons(hFig,hAxes,videoSrc) % Play button with text Start/Pause/Continue uicontrol(hFig,'unit','pixel','style','pushbutton','string','Start',... 'position',[10 10 75 25], 'tag','PBButton123','callback',... {@playCallback,videoSrc,hAxes}); % Exit button with text Exit uicontrol(hFig,'unit','pixel','style','pushbutton','string','Exit',... 'position',[100 10 50 25],'callback', ... {@exitCallback,videoSrc,hFig}); end
Эта функция обратного вызова вращает входной видеокадр и отображает исходный входной видеокадр и повернутый кадр на осях. Функция showFrameOnAxis отвечает за отображение кадра видео на определяемой пользователем оси. Эта функция определена в файле startFrameOnAxis.m
function playCallback(hObject,~,videoSrc,hAxes) try % Check the status of play button isTextStart = strcmp(hObject.String,'Start'); isTextCont = strcmp(hObject.String,'Continue'); if isTextStart % Two cases: (1) starting first time, or (2) restarting % Start from first frame if isDone(videoSrc) reset(videoSrc); end end if (isTextStart || isTextCont) hObject.String = 'Pause'; else hObject.String = 'Continue'; end % Rotate input video frame and display original and rotated % frames on figure angle = 0; while strcmp(hObject.String, 'Pause') && ~isDone(videoSrc) % Get input video frame and rotated frame [frame,rotatedImg,angle] = getAndProcessFrame(videoSrc,angle); % Display input video frame on axis showFrameOnAxis(hAxes.axis1, frame); % Display rotated video frame on axis showFrameOnAxis(hAxes.axis2, rotatedImg); end % When video reaches the end of file, display "Start" on the % play button. if isDone(videoSrc) hObject.String = 'Start'; end catch ME % Re-throw error message if it is not related to invalid handle if ~strcmp(ME.identifier, 'MATLAB:class:InvalidHandle') rethrow(ME); end end end
Эта функция определяет основной алгоритм, который вызывается при активации кнопки воспроизведения.
function [frame,rotatedImg,angle] = getAndProcessFrame(videoSrc,angle) % Read input video frame frame = step(videoSrc); % Pad and rotate input video frame paddedFrame = padarray(frame, [30 30], 0, 'both'); rotatedImg = imrotate(paddedFrame, angle, 'bilinear', 'crop'); angle = angle + 1; end
Эта функция обратного вызова освобождает системные объекты и закрывает окно рисунка.
function exitCallback(~,~,videoSrc,hFig) % Close the video file release(videoSrc); % Close the figure window close(hFig); end
end