0

我有许多图像要标记有一定数量的点。(对象跟踪)我impoint用来在图像上制作点,然后以逻辑方式将它们相互连接起来。到目前为止,一切都很好。接下来,我点击下一步(在我使用 GUIDE 开发的 MATLAB GUI 上),新图像加载到轴中并且信息丢失(点)。

  • 如何保留impoint下一张图像的绘图?
  • 如何确保当我移动 时impoint,绘制的线也会移动?

我仍然需要解决的是:

我已经在使用addNewPositionCallback来更新点的位置。编写时的回调:addNewPositionCallback(H, @fnc);它发出一个函数调用,例如fnc(pos)

我的问题是这个回调没有提供句柄。

因此,如果没有句柄信息,我无法解决代码中的正确元素。到目前为止,我已经实现了它,我已经为需要在图像上标记的固定数量的 18 个点编写了 18 个单线函数。这些函数调用相同的函数,该函数updatestructure(position, 'point_name', handles)在创建导入点后立即调用以在图像上绘制它们之间的链接。但在这里我也没有关于句柄的信息。这是我尝试过的:

pointname = impoint(gca,[]);
setcolor(h,'y');
position = getPosition(h);
updatestructure(position, 'pointname', handles);
addNewPositionCallback(h, @movepointname)

因此,当调用更新结构时,情节工作正常。我可以看到我想要什么。但是当我移动点函数movepointname()时,问题就开始了。

function movepointname (smart_pos)
updateStruct (smart_pos, 'pointname');
end

由于未传输句柄信息,这肯定会产生错误。我试图vargin定义当设置较少的参数调用时它应该做什么。因为我仍然需要某个地方的把手。

谢谢你。

4

3 回答 3

2

在显示和更新图像和绘图时使用句柄。

例如,当您第一次显示图像时(在任何轴上):

 hImg = image(ImageMatrix);

更新它不发出imageorimagesc或其他功能,而是直接更新它:

set(hImg, 'CData',NewImageMatrix');

在这种情况下,您轴上的其他所有内容都将保持不变。

你可以用你的积分做同样的把戏。你第一次像这样绘制:

hPlot = plot( PointsX, PointsY, '*-' ); % to plot * connected with line

然后你做

set(hPlot, 'XData',NewPointsX, 'YData',NewPointsY );

请注意,更新绘图时的实际点数不需要相同:您可以先绘制 3 个点,然后更新绘图句柄以显示 33 个点。

同样在 GUI 的初始化功能中,您可以使用

hPlot = plot( [], [], '*-' );

实际上什么都没有绘制,但句柄将可用于进一步更新。同样的事情也应该适用于图像,但是当您将图像更新为具有不同行数/列数的另一个图像时,您可能会遇到轴限制更新问题。要解决此问题,您可以像这样更新图像:

set(hImg, 'CData',NewImageMatrix', 'XData',1:size(NewImageMatrix,2), 'YData',1:size(NewImageMatrix,1) );

编辑:好的,上面将解决您的第一个问题。要在移动时更新线条impoint,您必须查找impoint参考,更具体地说是查找addNewPositionCallback功能。hPlot然后你必须定义用新坐标更新线条的回调函数(它甚至可以是像上面这样的普通绘图句柄)。

于 2013-05-16T16:00:47.413 回答
0

我的问题第二部分的答案可在以下链接中找到:Mathworks 论坛。老问题

传递其他变量或调用函数的技巧addNewPositionCallback如下:

addNewPositionCallback(Point_handle,@(p)movepointname(p,'point_Name',handles));

上面的这条语句根据我原来的问题传递了我想要的句柄,还允许我传递一些额外的变量。(p)用于此函数的默认回调,就像用于movepointname(p);点的当前位置一样。

希望能帮助到你。

于 2013-05-21T11:09:09.920 回答
0

您需要告诉图形在图像上绘制。为此,请使用 HOLD 功能。

hold(AXIS_HANDLE, 'on')

其中 AXIS_HANDLE 是坐标区句柄。您需要在尝试在图形上绘制任何其他内容之前执行此操作。

如果您只有一组轴,则可以调用

hold on

创建轴之后。

于 2013-05-16T15:43:56.543 回答