- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 MATLAB 图形用户界面:
1) 一个由activex控制的VLC窗口。
2) 一组单选按钮,用于在特定帧上“注释”视频。
我有工作代码,但我缺少调用注释的函数的输出。此函数 Annotate
应将带注释的值替换到先前创建的表 final_data
中。我可以将替换值显示到控制台,我希望 guidata
更新 handles
,所以我的主要函数的输出应该包含一个 .final_data
具有更新值的字段。但是,对输出对象调用 .final_data
会返回空占位符值。
function Annotate(varargin)
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
% change value of the orther button to 0
set(handles.hNotAnnotateButton, 'Value', 0);
mypos = handles.vlc.input.Position; % >> proxy to calculate frame
behavior = handles.Behavior; % >>> Tag to be annotated
% Calculate frame
myframe = ceil(handles.vlc.input.Time/1000 * handles.frameRate) - 1;
handles.final_data.behavior(myframe) = behavior;
display(handles.final_data(myframe, :)) % displays properly
guidata(handles.hFigure, handles) % not updating handles??
end
为了以防万一,这里是完整的功能
function handles = AnnotateVideo(filepath)
% Get some initial data from the video
filepath = fullfile(filepath);
% Get file duration
v = VideoReader(filepath);
handles.duration = v.Duration;
handles.frameRate = v.FrameRate;
delete(v)
total_frames = ceil(handles.duration * handles.frameRate) - 1;
%% Make some variables
handles.final_data.frameID = (1:total_frames)';
handles.final_data.behavior = strings(total_frames, 1);
% change format to table
handles.final_data = struct2table(handles.final_data);
% Place Holder for behavior
%% Build the Figure/GUI
% Video will be kept on handle
handles.filepath = filepath;
% Create figure to receive activex
handles.hFigure = figure('position', [50 50 1300 560], ...
'menubar', 'none', 'numbertitle', 'off', ...
'name', ['Video: ' filepath],...
'tag', 'VideoPlay', 'resize', 'on');
% Create play/pause and seek to 0 button
handles.hTogglePlayButton = uicontrol(handles.hFigure, ...
'position', [0 540 80 21], ...
'string', 'play/pause', 'callback',...
@TogglePlayPause);
handles.hSeekToZeroButton = uicontrol(handles.hFigure, ...
'position', [81 540 80 21], ...
'string', 'begining', 'callback',...
@SeekToZero);
handles.hGoToStartFrameButton = uicontrol(handles.hFigure, ...
'position', [161 540 80 21], ...
'string', 'StartFrame', 'callback',...
@SeekToStartFrame);
handles.hGoToEndFrameButton = uicontrol(handles.hFigure, ...
'position', [241 540 80 21], ...
'string', 'EndFrame', 'callback',...
@SeekToEndFrame);
%% Annotate button
handles.hAnnotateButton = uicontrol(handles.hFigure, ...
'Style', 'radiobutton', ...
'position', [980 320 100 41], ...
'String', 'Annotate', 'callback',...
@Annotate);
handles.hNotAnnotateButton = uicontrol(handles.hFigure, ...
'Style', 'radiobutton', ...
'position', [1100 320 100 41], ...
'String', 'Not-Annotate', ...
'Value', 1, ...
'callback', @NotAnnotate);
%% Make radio buttons for ethogram
handles.radio(1) = uicontrol('Style', 'radiobutton', ...
'Callback', @myRadio, ...
'Units', 'pixels', ...
'Position', [980, 500, 80, 22], ...
'String', 'Non-specific', ...
'Value', 0);
handles.radio(2) = uicontrol('Style', 'radiobutton', ...
'Callback', @myRadio, ...
'Units', 'pixels', ...
'Position', [980, 480, 80, 22], ...
'String', 'Rearing', ...
'Value', 0);
handles.radio(3) = uicontrol('Style', 'radiobutton', ...
'Callback', @myRadio, ...
'Units', 'pixels', ...
'Position', [980, 460, 80, 22], ...
'String', 'Snif', ...
'Value', 0);
handles.radio(4) = uicontrol('Style', 'radiobutton', ...
'Callback', @myRadio, ...
'Units', 'pixels', ...
'Position', [980, 440, 80, 22], ...
'String', 'Retrieving', ...
'Value', 0);
handles.radio(5) = uicontrol('Style', 'radiobutton', ...
'Callback', @myRadio, ...
'Units', 'pixels', ...
'Position', [1100, 500, 80, 22], ...
'String', 'Self-Groom', ...
'Value', 0);
%% Activex control for VLC player
% Create activex control
handles.vlc = actxcontrol('VideoLAN.VLCPlugin.2', [0 0 960 540], handles.hFigure);
% Format filepath so that VLC can use it
% Read into vlc
filepath = ['file://localhost/' filepath];
% Add file to playlist
handles.vlc.playlist.add(filepath);
% Play file
handles.vlc.playlist.play();
% Deinterlace
handles.vlc.video.deinterlace.enable('x');
% Go back to begining of file
handles.vlc.input.time = 0;
% Register an event to trigger when video is being played regularly
handles.vlc.registerevent({'MediaPlayerTimeChanged', @MediaPlayerTimeChanged});
% Position changed
handles.vlc.registerevent({'MediaPlayerPositionChanged', @MediaPlayerPositionChanged});
% Save handles
guidata(handles.hFigure, handles);
%% Helper functions and button callbacks
function MediaPlayerPositionChanged(varargin)
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
% Get position
handles.mypos = handles.vlc.input.Position;
% Get frame
handles.myframe = handles.vlc.input.Time;
% If position is changing AND annotate button is 'ON' (value == 1)
% Annotate
will_annotate = get(handles.hAnnotateButton, 'Value');
if(will_annotate)
Annotate
end
end
%% Display running time in application title
function MediaPlayerTimeChanged(varargin)
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
myframe = handles.vlc.input.Time;
set(hFigure, 'name', [handles.filepath ' ; ' num2str(myframe/1000) ' sec.']);
end
%% Annotate: MAIN 'Looping' Function
% called when position is changed and annotate button
function Annotate(varargin)
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
% change value of the orther button to 0
set(handles.hNotAnnotateButton, 'Value', 0);
mypos = handles.vlc.input.Position;
behavior = handles.Behavior;
% Calculate frame
myframe = ceil(handles.vlc.input.Time/1000 * handles.frameRate) - 1;
handles.final_data.behavior(myframe) = behavior;
display(handles.final_data(myframe, :))
guidata(handles.hFigure, handles)
end
%% Not annotate, basic placeholder to not annotate
function NotAnnotate(varargin)
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
% change value of the orther button to 0
set(handles.hAnnotateButton, 'Value', 0);
end
function TogglePlayPause(varargin)
% Toggle Play/Pause
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
handles.vlc.playlist.togglePause();
end
function SeekToZero(varargin)
% Seek to begining of file
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
handles.vlc.input.Time = 0;
end
function SeekToStartFrame(varargin)
% Seek StartFrame of file
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
handles.vlc.input.Time = StartFrame;
end
function SeekToEndFrame(varargin)
% Seek to EndFrame of file
hFigure = findobj('tag', 'VideoPlay');
handles = guidata(hFigure);
handles.vlc.input.Time = EndFrame;
end
function myRadio(RadioH, EventData)
handles = guidata(RadioH);
otherRadio = handles.radio(handles.radio ~= RadioH);
set(otherRadio, 'Value', 0);
set(handles.hAnnotateButton, 'Value', 0);
handles.Behavior = RadioH.String;
sprintf('Switching to...%s', handles.Behavior)
guidata(handles.hFigure, handles)
end
% End of global function
end
最佳答案
这是因为输出变量永远不会用新的 guidata 更新...
运行你的程序:
handles = AnnotateVideo(<filepath>)
您可以使用(从命令行)更新结构句柄:
handles = guidata(handles.hFigure);
关于matlab - guidata 未在 MATLAB GUI 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49639934/
在 Matlab 中,您可以选择创建新的“示例”脚本文件以及脚本、函数、类等。创建它们时,它们会获得一个脚本图标。 它们与其他标准脚本文件的处理方式有何不同? 是否有关于这些示例脚本类型的预期用途的文
我正在运行一个不是我自己编写的大 m 文件,它依赖于某些子函数。我想知道是否在所有嵌套函数的任何地方都使用了特定函数(在我的例子中是函数 eig.m(计算特征值))。有没有快速的方法来做到这一点? 亲
Matlab中有一个函数叫 copulafit .我怎样才能看到这个函数背后的代码?许多 Python 的 numpy 和 scipy 函数在 Github 上很容易开源,但由于某种原因我在 Gith
我定义了一个抽象基类measurementHandler < handle它定义了所有继承类的接口(interface)。这个类的两个子类是a < measurementHandler和 b < me
假设有一个矩阵 A = 1 3 2 4 4 2 5 8 6 1 4 9 例如,我有一个 Vector 包含该矩阵每一列的“类”
我有一个在后台运行的 Matlab 脚本。随着计算的进行,它会不断弹出进度栏窗口。这很烦人。 问题是我没有自己写 Matlab 脚本,这是一段很长很复杂的代码,我不想搞砸。那么如何在不修改 Matla
有没有办法从一个 matlab 程序中检测计算机上正在运行多少个 matlab 进程? 我想要恰好有 n 个 matlab 进程在运行。如果我的数量太少,我想创建它们,如果数量太多,我想杀死一些。您当
我正在测试我们在 Matlab 中开发的一个独立应用程序,当时我注意到它的内存使用量(根据 Windows 任务管理器)达到了 16gb 以上的数倍峰值。我决定在编译版本后面的脚本上使用 profil
我面临着一个相当棘手的问题。在 Matlab 中,命令 S = char(1044) 将俄语字母 д 放入变量 S。但是 disp(S) 返回空白符号,尽管内容实际上是正确的: >> S = char
我在这行 MATLAB 代码中遇到内存不足错误: result = (A(1:xmax,1:ymax,1:zmax) .* B(2:xmax+1,2:ymax+1,2:zmax+1) +
我正在寻找一种在 MATLAB 中比较有限顺序数据与非确定性顺序的方法。基本上,我想要的是一个数组,但不对包含的元素强加顺序。如果我有对象 a = [x y z]; 和 b = [x z y]; 我希
我有一个由 1 和 0 组成的二维矩阵。 mat = [0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1]; 我需
我可以在 Matlab 中用一组 x,y 点绘制回归线。但是,如果我有一组点(如下图),假设我有四组点,我想为它们绘制四条回归线……我该怎么做?所有的点都保存在 x,y 中。没有办法将它们分开并将它们
我正在尝试使用以下代码在 MATLAB 中绘制圆锥体。但是,当 MATLAB 生成绘图时,曲面中有一个间隙,如下图所示。谁能建议关闭它的方法? clearvars; close all; clc; [
我有一个 map称为 res_Map,包含一组不同大小的数组。我想找到用于存储 res_Map 的总内存。 正如您在下面看到的,看起来 res_Map 几乎不占用内存,而 res_Map 中的各个元素
有没有办法在 MATLAB 中组合 2 个向量,这样: mat = zeros(length(C),length(S)); for j=1:length(C) mat(j,:)=C(j)*S;
已结束。此问题不符合 Stack Overflow guidelines 。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答它。 关闭 5 年前
我正在尝试将MatLab中的t copula适配到我的数据,并且我的功能是: u = ksdensity(range_1, range_1,'function','cdf'); v = ksdens
大家好,我目前正在尝试使用论文“多尺度形态学图像简化”中的 SMMT 运算符 Dorini .由于没有订阅无法访问该页面,因此我将相关详细信息发布在这里: 请注意,我将相关文章的部分内容作为图片发布。
我在MATLAB中编写代码,需要使用一个名为modwt的函数,该函数同时存在于两个我同时使用的工具箱(Wavelet和WMTSA)中。问题在于,一个版本仅返回一个输出,而另一个版本则返回三个输出。我应
我是一名优秀的程序员,十分优秀!