1

我编写了一个 matlab 项目,它将视频作为输入,将其切割成帧,并一帧一帧地显示给用户,让他能够对每一帧进行更改。

我想添加一个“侧边栏”,向用户显示特定的框架,以及从 1 到 10 的 GUI 框架的按钮,当他可以按“->”或“<-”移动到 prev\接下来 10 帧,并且可以单击一个帧以更大的尺寸显示它。

像这样的东西:

   This is the GUI:
.__________________________________.
|                                  | 
|          Frame No. i             | 
|                                  | 
|--------------------------------- | 
|<-| Frame j|j+1|.....|Frame j+9|->| 
|__________________________________|

我考虑过使用“子图”,但不知道如何添加在单击时显示\更新上一个\下一个帧的功能。

另一种实现是这样的:

% The Main Image:
   hAx = axes('Position',[0 0.3 1 0.8], 'Parent',hFig);
   hMainImg = imshow(img, 'Parent',hAx);

% the slider
hPanel = uipanel('Position',[0 0.04 1 0.26], 'Parent',hFig);
uicontrol('Style','slider', 'Parent',hFig, ...
    'Callback',@slider_callback, ...
    'Units','normalized', 'Position',[0 0 1 0.04], ...
    'Value',1, 'Min',1, 'Max',mx, 'SliderStep',[1 10]./mx);

但是,那么滑块呢?

任何想法我该如何实施?

4

3 回答 3

1

您可以查看我发布到 MatlabCentral 的 videoioPlayer。播放器通过 VIDEOIO 库逐帧读取文件(*.avi、*.mov、*.mpeg、...)中的视频——因此 videoio 库非常节省内存。

videoioPlayer 允许用户通过键盘输入来跳转视频(例如,'+' 前进一帧,'CTRL +' 进一步跳转 10 帧,'ALT +' 前进 100 帧,'SPACE' 是开始/暂停/恢复播放等.) 此外,videoioPlayer 允许插入(自定义)过滤器功能,该过滤器功能在显示之前应用于每个帧。并且 videoioPlayer 可以与其他 videoioPlayer 同步,以便同时显示 2 个视频(例如原始视频和处理后的视频)

可以编写一个过滤器插件(参见 videoioPlayer 的演示文件)来处理您的用户输入;因此,如果您设法编译了 videoiolibrary(在 linux 下直接编译,对​​于 mac 来说有点棘手,从未尝试过 windows 但您需要 VisualStudio),您可以直接使用播放器来完成您的任务。

如果您不想使用 videoiolib,您可以更改播放器以使用不同的帧抓取方法,或者只是尝试了解 videoioplayer 中的回调函数以获得对您项目的启发。

以下是链接:

http://sourceforge.net/projects/videoio/files/

http://www.mathworks.com/matlabcentral/fileexchange/35119-videoioplayer

于 2012-07-12T08:53:43.610 回答
1

这是一个工作示例。我们打开一个小视频文件,并读取其所有 141 帧。您可以使用滑块浏览它们,单击任何小图像以将其显示在主轴上。

function framesBrowserDemo()
    %# read all frames at once
    vid = VideoReader('xylophone.mpg');
    numImgs = get(vid, 'NumberOfFrames');
    frames = read(vid);
    clear vid

    %# design GUI
    numThumbs = 5;
    mx = numImgs-numThumbs+1;
    hFig = figure('Menubar','none');
    hPanel = uipanel('Position',[0 0.04 1 0.16], 'Parent',hFig);
    uicontrol('Style','slider', 'Parent',hFig, ...
        'Callback',@slider_callback, ...
        'Units','normalized', 'Position',[0 0 1 0.04], ...
        'Value',1, 'Min',1, 'Max',mx, 'SliderStep',[1 10]./mx);

    %# main axis, and show first frame
    hAx = axes('Position',[0 0.2 1 0.8], 'Parent',hFig);
    hMainImg = imshow(frames(:,:,:,1), 'Parent',hAx);

    %# thumbnail axes
    hThumImg = zeros(numThumbs,1);
    for i=1:numThumbs
        %# create axis, show frame, hookup click callback
        hAx = axes('Parent',hPanel, ...
            'Position',[(i-1)/numThumbs 0 1/numThumbs 1]);
        hThumImg(i) = imshow(frames(:,:,:,i), 'Parent',hAx);
        set(hThumImg(i), 'ButtonDownFcn',@click_callback)
        axis(hAx, 'normal')
    end

    %# callback functions
    function slider_callback(src,~)
        val = round(get(src,'Value'));  %# starting index
        %# update the thumbnails
        for k=1:numel(hThumImg)
            set(hThumImg(k), 'CData',frames(:,:,:,k+val-1))
            drawnow
        end
    end

    function click_callback(src,~)
        %# update the main image
        set(hMainImg, 'CData',get(src,'CData'));
        drawnow
    end
end

截屏

于 2012-07-13T23:28:44.897 回答
0

您可以使用 subplot 命令定义布局:

http://www.mathworks.de/help/techdoc/ref/subplot.html

于 2012-07-12T09:01:13.637 回答