2016-09-20 32 views
0

我写了下面的代码,通过它我使用加载按钮加载图像,然后使用绘制按钮在图像上绘制不同的矩形并将它们保存到文本文件。添加和删除图像上的可拖动矩形并保存到文件

我在图片上做了3个按钮。

1.load(它加载GUI上的图像) 2.Draw(通过按下它用户将能够利用图像拖动的矩形。 3.Save(使用该按钮用户能够保存在文本文件中的所有矩形)。

负载

function loadButton_Callback(hObject, eventdata, handles) 
% hObject handle to loadButton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
I=imread('http://ichef.bbci.co.uk/corporate2/images/width/live/p0/0l/3r/p00l3rnt.jpg/624'); 
imshow(I); 
rectangles=cell(1,1); 
count=0; 
handles.rectangles=rectangles; 
handles.count=count; 
guidata(hObject,handles); 

绘制

function drawButton_Callback(hObject, eventdata, handles) 
% hObject handle to drawButton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
rectangles=handles.rectangles; 
count=handles.count; 
count=count+1; 
h=imrect; 
rectangles{count,1}=h; 
handles.count=count; 
handles.rectangles=rectangles; 
guidata(hObject,handles); 

保存

function saveButton_Callback(hObject, eventdata, handles) 
% hObject handle to saveButton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
rectangles=handles.rectangles; 
for i=1:length(rectangles) 
    dlmwrite('P:\bla.txt',rectangles{i}.getPosition,'-append','delimiter',' ','newline','pc'); 
end 

上面的代码工作很好地与下面的问题。如果我删除一个矩形(一个或多个),然后下面的错误出现?

**Invalid or deleted object**. 

回答

1

之前保存,你应该检查一下你的矩形是有效的句柄对象(即未删除):

function saveButton_Callback(hObject, eventdata, handles) 
     rectangles=handles.rectangles; 
     delete('P:\bla.txt'); 
     fclose(fopen('P:\bla.txt', 'w')); % To be able to append 
     for k=1:length(rectangles) 
       if isvalid(rectangles{k}) 
         dlmwrite(... 
          'P:\bla.txt', rectangles{k}.getPosition, ... 
          '-append',        ... 
          'delimiter', ' ',      ... 
          'newline', 'pc'       ... 
         ); 
       end; 
     end; 

无关的问题,但有一天可能会救你拔头发的时间:不要使用i作为变量,因为它是MATLAB中的虚构单元。

+0

代码不运行,因为ishandle总是返回0,所以我在if条件中使用了negation。但是当我删除了一个矩形“删除的对象”时出现了同样的错误 –

+0

我没有图像工具箱来测试,但这个想法应该是正确的。你可以用'isvalid'来代替吗? (以防万一是一个继承'handle'类的对象) – 2016-09-20 11:12:04

+0

恐怕这个想法只有当我捕捉到删除矩形时触发的事件才有效。 –

相关问题