Matlab GUI 中带滑块的 WindowScrollWheelFcn
WindowScrollWheelFcn with slider in Matlab GUI
我正在 Matlab 中制作一个 GUI,它可以滚动并显示约 600 张医学图像。我有一个显示图像的轴,还有一个滚动条,当按下结束箭头时,它会一次显示一个图像。
我正在尝试了解如何合并 WindowScrollWheelFcn 以便我可以使用鼠标滚动来更快地浏览图像。
这是我的代码:
function ct_slider_Callback(hObject, eventdata, handles)
set(gcf, 'WindowScrollWheelFcn', @wheel);
set(gcf, 'CurrentAxes', handles.ct_image_axes);
handles.currentSlice = round(get(handles.ct_slider, 'Value'));
imshow(handles.imageArray(:,:,handles.currentSlice));
text = sprintf('Slice number: %d', handles.currentSlice);
set(handles.ct_slice_number, 'String', text);
guidata(hObject, handles);
function wheel(hObject, callbackdata, handles)
if callbackdata.VerticalScrollCount > 0
handles.currentSlice = handles.currentSlice + 1;
elseif callbackdata.VerticalScrollCount < 0
handles.currentSlice = handles.currentSlice - 1;
end
guidata(hObject,handles);
我一直收到错误消息:"Error using Image_GUI_new>wheel Not enough input arguments."
我对 Matlab 中的 GUI 没有丰富的经验,所以任何帮助将不胜感激。
你非常接近!
默认情况下,回调函数在定义时会分配 2 个输入参数:
set(gcf, 'WindowScrollWheelFcn', @wheel);
等同于
set(gcf, 'WindowScrollWheelFcn', @(DummyA,DummyB) wheel);
如果您需要添加一个输入参数,例如 handles
结构,您可以将所有输入变量(即 2 个必需变量加上您喜欢的任何变量)包装在一个元胞数组中,如下所示:
set(gcf, 'WindowScrollWheelFcn', {@wheel,handles});
因此函数 wheel
接受 2 个强制输入 + handles
结构。现在应该可以了。
如果可以的话,重复使用 imshow
在性能方面不是很好,如果要在 ct_slider_Callback
中连续显示许多图像,您可能想使用这个技巧:
1) 当显示第一张图片(这里是数字1)时,分配一个句柄作为输出给imshow
.
hShow = imshow(handles.imageArray(:,:,1));
2) 然后在执行回调时,不再调用 imshow
,而是更新创建的 hShow
句柄的 cdata
属性:
set(hShow,'cdata',handles.imageArray(:,:, handles.currentSlice)));
您可能会发现图像显示更流畅...
希望对您有所帮助!
我正在 Matlab 中制作一个 GUI,它可以滚动并显示约 600 张医学图像。我有一个显示图像的轴,还有一个滚动条,当按下结束箭头时,它会一次显示一个图像。
我正在尝试了解如何合并 WindowScrollWheelFcn 以便我可以使用鼠标滚动来更快地浏览图像。
这是我的代码:
function ct_slider_Callback(hObject, eventdata, handles)
set(gcf, 'WindowScrollWheelFcn', @wheel);
set(gcf, 'CurrentAxes', handles.ct_image_axes);
handles.currentSlice = round(get(handles.ct_slider, 'Value'));
imshow(handles.imageArray(:,:,handles.currentSlice));
text = sprintf('Slice number: %d', handles.currentSlice);
set(handles.ct_slice_number, 'String', text);
guidata(hObject, handles);
function wheel(hObject, callbackdata, handles)
if callbackdata.VerticalScrollCount > 0
handles.currentSlice = handles.currentSlice + 1;
elseif callbackdata.VerticalScrollCount < 0
handles.currentSlice = handles.currentSlice - 1;
end
guidata(hObject,handles);
我一直收到错误消息:"Error using Image_GUI_new>wheel Not enough input arguments."
我对 Matlab 中的 GUI 没有丰富的经验,所以任何帮助将不胜感激。
你非常接近!
默认情况下,回调函数在定义时会分配 2 个输入参数:
set(gcf, 'WindowScrollWheelFcn', @wheel);
等同于
set(gcf, 'WindowScrollWheelFcn', @(DummyA,DummyB) wheel);
如果您需要添加一个输入参数,例如 handles
结构,您可以将所有输入变量(即 2 个必需变量加上您喜欢的任何变量)包装在一个元胞数组中,如下所示:
set(gcf, 'WindowScrollWheelFcn', {@wheel,handles});
因此函数 wheel
接受 2 个强制输入 + handles
结构。现在应该可以了。
如果可以的话,重复使用 imshow
在性能方面不是很好,如果要在 ct_slider_Callback
中连续显示许多图像,您可能想使用这个技巧:
1) 当显示第一张图片(这里是数字1)时,分配一个句柄作为输出给imshow
.
hShow = imshow(handles.imageArray(:,:,1));
2) 然后在执行回调时,不再调用 imshow
,而是更新创建的 hShow
句柄的 cdata
属性:
set(hShow,'cdata',handles.imageArray(:,:, handles.currentSlice)));
您可能会发现图像显示更流畅...
希望对您有所帮助!