【问题标题】:Retaining a Plot on a Image drawn using impoint function在使用导入功能绘制的图像上保留绘图
【发布时间】:2013-05-11 13:46:52
【问题描述】:

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

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

我仍然需要解决的是:

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

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

因此,如果没有句柄信息,我无法处理代码中的正确元素。到目前为止,我已经实现了它,我已经为需要在图像上标记的固定数量的 18 个点编写了 18 个 One-liner 函数。这些函数调用相同的函数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 来定义当设置较少的参数调用时它应该做什么。因为我仍然需要某个地方的把手。

谢谢。

【问题讨论】:

    标签: image matlab plot matlab-guide axes


    【解决方案1】:

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

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

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

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

    希望对你有帮助。

    【讨论】:

      【解决方案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 这样的普通绘图句柄)。

      【讨论】:

      • 您的详细回复。由于字符限制,我无法在此处添加更多信息。已在问题描述中添加信息以更详细地说明问题。
      • 我记得前段时间我遇到了与imrect 矩形类似的问题,因为它们也不会在回调中公开它们的句柄。见这里:mathworks.com/matlabcentral/newsreader/view_thread/282342希望它有所帮助
      • 我想我找到了解决方案。一旦可行,将详细发布完整的解决方案。仍在努力。短暂的假期后回来,有点生疏。
      • 这不知何故不起作用。当我尝试使用set(handles.hPlot, 'XData', x, 'YData', y,'Color','w','LineWidth',1); 设置值时,我收到一条错误消息:??? Reference to non-existent field 'hPlot'.。有什么建议吗?
      • 好像handles结构中没有hPlot。确保将修改后的 handles 结构存储在使用 guidata(hObject, handles); 修改它的每个回调函数的末尾。
      【解决方案3】:

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

      hold(AXIS_HANDLE, 'on')
      

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

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

      hold on
      

      在创建坐标区之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-16
        • 2013-04-09
        • 1970-01-01
        • 2013-11-26
        • 2018-03-16
        • 2017-06-09
        • 1970-01-01
        • 2015-02-15
        相关资源
        最近更新 更多