2014-02-17 257 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