我有一个“轮廓开始”按钮,其回调在imellipse
的坐标处创建一个ginput
对象。然后,我可以拖动imellipse
以便通过addNewPositionCallback
调整图像的轮廓。我计算imellipse
和轮廓之间的交点,并相应地更新轮廓。
目前,我只能在点击“轮廓开始”按钮后更新轮廓,但是每当移动addNewPositionCallback
时都希望调用imellipse
,而不仅仅是第一个按下按钮后移动。我试图使用waitfor()
,但它没有用。
带有imellipse的轴
在轮廓开始按下按钮后通过imellipse调整的轮廓
轮廓不再通过imellipse的移动来调整
答案 0 :(得分:0)
这是一个简单的演示,展示了如何为addNewPositionCallback
imellipse
方法实现函数。这是一个简单的演示,但你会明白这个想法。如果不清楚,请询问。
有一个用于绘制椭圆的按钮和一个用于显示椭圆位置的文本框(以显示它的工作原理:)。
function MoveEllipse
clc
clear
close all
%// Load demo data
I = imread('coins.png');
%// Create GUI
hFig = figure('Position',[100 100 400 400],'Units','normalized');
%// create axes with handle
handles.axes1 = axes('Position', [0.2 0.2 0.6 0.6]);
%// Create pusbutton to draw ellipse
handles.DrawEllipseButton= uicontrol('style', 'push','position', [40 40 100 30],'String','Draw ellipse', 'callback', @(s,e) DrawEllipse);
%// Create edit box to display position
handles.PositionBox = uicontrol('style', 'text','position', [150 30 150 60],'String','','BackgroundColor','w');
%// Show image
imshow(I)
guidata(hFig,handles);
%// Pushbutton callback to draw ellipse.
function DrawEllipse
hEllipse = imellipse(gca);
addNewPositionCallback(hEllipse,@(x) GetEllipsePosition(x))
end
%// Actual function called by the addNewPositionCallback method
function GetEllipsePosition(pos)
set(handles.PositionBox,'String',pos);
end
end
按下按钮并移动椭圆后的示例屏幕截图: