Event listener for multiple draggable rectangles using imrect in matlab
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Naseer Khan
am 8 Sep. 2016
Bearbeitet: Rajeev Yadav
am 14 Jul. 2022
function computeButton_Callback(hObject, eventdata, handles)
% hObject handle to computeButton (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
PImage=handles.ProcessedImage;
Image=handles.Image;
imshow(Image);
hold on;
bw=bwconncomp(PImage,4);
regions=regionprops(bw,'BoundingBox','PixelIdxList');
for i=1:length(regions)
box=regions(i).BoundingBox;
h=imrect(gca,box);
%rectangle('Position',box,'EdgeColor','black','LineWidth',2);
end
%I want to make an event listener that would record the
%properties(height,width) of all the rectangles and even
%the changes on each of the draggable rectangles on the Image.
0 Kommentare
Akzeptierte Antwort
Guillaume
am 8 Sep. 2016
Do you really want to listen to all the changes in position of the rectangles? There will be a lot of event recorded when the user drag a handle. If you only need to know what the current position of the rectangles is at some point in the code, you can just query it. For that, you obviously need to save the rectangle handles somewhere:
%...
hrectangles = gobjects(numel(regions), 1); %allocate storage for rectangle handles
for i = 1:numel(regions)
box = regions(i).BoundingBox;
hrectangles(i) = imrect(gca, box); %store rectangle handles
end
%...
%code where you need to know what the coordinates of the rectangles are:
rectpos = cell2mat(arrayfun(@getPosition, hrectangles, 'UniformOutput', false));
If you really want to listen to all the changes, you can add a new position callback to each rectangle and do whatever you need to do in that callback:
for i = 1:numel(regions)
box = regions(i).BoundingBox;
h = imrect(gca, box);
h.addNewPositionCallback(@(newpos) RectPositionChangedCallback(h, newpos)
end
with
function RectPositionChangedCallback(recthandle, newposition)
%do something with new position
end
6 Kommentare
Guillaume
am 9 Sep. 2016
Indeed, if a rectangle is deleted, then its handle is no longer valid, and getPosition is not going to be happy. The simplest thing is to remove these deleted handles from the cell array:
hvalidrects = handles.hrectangles(cellfun(@isvalid, handles.hrectangles)); %remove deleted handles
rectpos = cell2mat(cellfun(@getPosition, hvalidrects, 'UniformOutput', false)); %get position of valid rectangles
If a rectangle is added, you need to add it to cell array in whichever function is creating this new rectangle.
Weitere Antworten (1)
Rajeev Yadav
am 14 Jul. 2022
Bearbeitet: Rajeev Yadav
am 14 Jul. 2022
Can we add ARROW KEYS (UP ARROW, RIGHT ARROW, LEFT ARROW,DOWN ARROW) with fixed step size control to move the rectangle?
0 Kommentare
Siehe auch
Kategorien
Mehr zu Graphics Object Programming finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!