在使用咬合功能绘制的图像上保留一个图

时间:2013-05-16 15:15:17

标签: image matlab plot matlab-guide axes

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

  • 如何为下一张图片保留已设定的impoint
  • 如何确保在移动impoint时,绘制的线条也会移动?

我还需要解决的问题是:

我已经使用addNewPositionCallback来更新点的位置。写入时回调:addNewPositionCallback(H, @fnc);它发出类似fnc(pos)

的函数调用
  

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

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

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来定义当设置较少的参数调用时它应该做什么。在那里我仍然需要来自某个地方的句柄。

谢谢。

3 个答案:

答案 0 :(得分:2)

在显示和更新图像和图表时使用手柄。

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

 hImg = image(ImageMatrix);

更新它不会发出imageimagesc或其他功能, 但是直接更新它:

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上面的普通情节句柄一样)。

答案 1 :(得分:0)

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

hold(AXIS_HANDLE, 'on')

其中AXIS_HANDLE是轴句柄。在尝试绘制图中的任何其他内容之前,您需要执行此操作。

如果你只有一组轴,你可以打电话

hold on
创建轴后

答案 2 :(得分:0)

我的问题第二部分的答案可在链接上找到:Mathworks forum. old question

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

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

上面的这句话按原来的问题传递了我想要的句柄,也允许我传递一些额外的变量。 (p)用于此函数的默认回调,因为movepointname(p);用于该点的当前位置。

希望它有所帮助。