我有许多图像要标记一定数量的点。 (对象跟踪)
我正在使用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
来定义当设置较少的参数调用时它应该做什么。在那里我仍然需要来自某个地方的句柄。
谢谢。
答案 0 :(得分:2)
在显示和更新图像和图表时使用手柄。
例如,当您第一次显示图像时(在任何轴上):
hImg = image(ImageMatrix);
更新它不会发出image
或imagesc
或其他功能,
但是直接更新它:
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);
用于该点的当前位置。
希望它有所帮助。