2014-02-17 114 views
1

使用下面的代码,我可以很容易地在给定的图像上绘制一个可拖动的矩形。在图像上绘制多个可拖动的矩形?

figure; 
imshow('image.png'); 

h = imrect; 
p = wait(h);            % get the rect position 
rectangle('Position', p, 'LineWidth',2, 'EdgeColor','r'); % draw here 

enter image description here

的问题是:我怎么能在图像上绘制多个拖动矩形?此外,矩形的数量是未知的预手

P.S.如果我已经绘制了矩形的数量,它将变得更加容易。例如,如果我想提请2个rectangels,下面的代码将工作,即只是把作为众多wait()

figure; 
imshow('image.png'); 

h = imrect; 
p = wait(h);            % get the rect position 
rectangle('Position', p, 'LineWidth',2, 'EdgeColor','r'); % draw here 
p2 = wait(h);            % get the rect position 
rectangle('Position', p2, 'LineWidth',2, 'EdgeColor','r'); % draw here 

回答

3

一种方法是包裹的位置收购while循环,并添加某种uicontrol以表明您何时完成。在这种情况下,只需按一下按钮即可完成后删除imrect句柄。如果句柄被删除,h不再有效,所以isvalid停止while循环。 ~isempty用作p的最后一个返回值将为空。

注意,此代码覆盖p每一次,所以如果你想记录所有的位置,不只是绘制矩形,你需要补充一点。

figure 
imshow(I) 
h = imrect 

uicontrol('Style', 'pushbutton', 'String', 'Done',... 
     'Position', [20 20 50 20],... 
     'Callback', 'delete(h)'); 

while isvalid(h) 
    p = wait(h);   
    if ~isempty(p)          
     rectangle('Position', p, 'LineWidth',2, 'EdgeColor','r'); 
    end 
end 
+0

谢谢,它的工作。有关如何将'NextFrame'按钮迁移到'uicontrol'而不是'Done'的想法,因为我想循环播放一个视频并绘制它的每一帧? – herohuyongtao

+0

P.S.在你的解决方案中,在绘制第一个矩形后,“完成”按钮将显示,对于没有矩形的情况有任何想法,即在绘制之前显示“完成”按钮? – herohuyongtao

+1

用位置初始化'imrect',例如'h = imrect(gca,[10 10 100 100]);'在继续放置uicontrol之前,它不会等待用户输入。对于另一个 - 这是一个完整的问题 - 但基本上你需要一个外部循环来处理保存注释图像并提供下一帧(如果有的话)。 – nkjt