Adding index to a function.

2 Ansichten (letzte 30 Tage)
Kevin P Meyer
Kevin P Meyer am 7 Okt. 2021
Kommentiert: Matt J am 8 Okt. 2021
Hello, I am trying to add an index to a function. I have an ROI on an image. Each time the ROI moves on the image, I want the index to increase by 1. So when I move the ROI for a fourth time i want the index to be equal to 4. I have the index sum = 0, and then when the ROI moves I say sum = sum+1;. However, when I do this, the function repeats and just sets the sum = 0, and so the sum is always equal to 1, instead of increasing by integer values. Does anyone have an idea on how to fix this. I tried putting the sum = 0 line on the outside of the function but then the function doesn't know what sum is and it is undefined.
clear
clc
I = imread('air.jpg');
I = rgb2gray(I);
I = im2double(I);
imshow(I)
roi = drawrectangle('Color','r');
addlistener(roi,'MovingROI',@allevents)
addlistener(roi,'ROIMoved',@allevents)
function allevents(src,evt)
evname = evt.EventName;
I = imread('air.jpg');
I = rgb2gray(I);
I = im2double(I);
sum = 0;
switch(evname)
case{'MovingROI'}
%donothing for now
case{'ROIMoved'}
sum = sum+1
disp(['ROI moved previous position: ' mat2str(evt.PreviousPosition)]);
disp(['ROI moved current position: ' mat2str(evt.CurrentPosition)]);
end
end

Akzeptierte Antwort

Matt J
Matt J am 7 Okt. 2021
Bearbeitet: Matt J am 7 Okt. 2021
One way is to nest the function inside an outerFunction() and make the accumulator an externally scoped variable. In the example below, I've renamed your accumulator from sum to accum since the latter avoids conflict with the builtin Matlab sum() function.
function outerFunction
accum=0; %<-----------MOVE HERE
I = imread('air.jpg');
I = rgb2gray(I);
I = im2double(I);
imshow(I)
roi = drawrectangle('Color','r');
addlistener(roi,'MovingROI',@allevents)
addlistener(roi,'ROIMoved',@allevents)
function allevents(src,evt)
evname = evt.EventName;
I = imread('air.jpg');
I = rgb2gray(I);
I = im2double(I);
switch(evname)
case{'MovingROI'}
%donothing for now
case{'ROIMoved'}
accum = accum+1
disp(['ROI moved previous position: ' mat2str(evt.PreviousPosition)]);
disp(['ROI moved current position: ' mat2str(evt.CurrentPosition)]);
end
end
end
  1 Kommentar
Kevin P Meyer
Kevin P Meyer am 7 Okt. 2021
Thank you so much! I have been stuck on that for a while.Makes sense

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Matt J
Matt J am 7 Okt. 2021
Bearbeitet: Matt J am 7 Okt. 2021
You could also have used a persistent variable.
function allevents(src,evt)
persistent accum
if isempty(accum), accum=0; end %first time called
evname = evt.EventName;
I = imread('air.jpg');
I = rgb2gray(I);
I = im2double(I);
switch(evname)
case{'MovingROI'}
%donothing for now
case{'ROIMoved'}
accum = accum+1
disp(['ROI moved previous position: ' mat2str(evt.PreviousPosition)]);
disp(['ROI moved current position: ' mat2str(evt.CurrentPosition)]);
end
end
  2 Kommentare
Kevin P Meyer
Kevin P Meyer am 7 Okt. 2021
Ah, okay. The nested function works well for my applications right now but I may try that way to see how it affects the speed. Do you think I could make my image, I, a persistent variable? Would this mean that the function wouldn't have to read it each time?
Matt J
Matt J am 8 Okt. 2021
Yes, you can make any variable a persistent variable.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Images finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by