Can vision.For​egroundDet​ector work on GUI

1 view (last 30 days)
Hi, Can I use GUI to display foreground from vision.ForegroundDetector? By using the same method I can extract the foreground. But in the GUI I can't display the foreground. Please help, thanks
  3 Comments
Leona Chan
Leona Chan on 14 Aug 2017
Yes, I had. I can display the frame, but foreground cannot. These are some pieces of code
function playCallback(hObject,~,videoSrc,hAxes)
while strcmp(hObject.String, 'Pause') && ~isDone(videoSrc)
[frame,result] = getAndProcessFrame(videoSrc);
showFrameOnAxis(hAxes.axis1, frame);
showFrameOnAxis(hAxes.axis2, result);
end
function [frame,foreground] = getAndProcessFrame(videoSrc)
foregroundDetector = vision.ForegroundDetector('NumGaussians', 4, ... 'NumTrainingFrames', 60);
frame = step(videoSrc);
foreground = step(foregroundDetector, frame); end
Jiro Doke
Jiro Doke on 15 Aug 2017
Edited: Jiro Doke on 15 Aug 2017
What do you mean by "you can't display the foreground"? Do you get an error? Does it show something but not what you expect? Is it possible that for the frame input, no foreground was detected? What exactly is the situation?

Sign in to comment.

Accepted Answer

Leona Chan
Leona Chan on 15 Aug 2017
As above code, showFrameOnAxis(hAxes.axis1, frame); showFrameOnAxis(hAxes.axis2, foreground); The frame can show in both axis1 or axis2, but put foreground either axis1 or axis2 also nothing to display.
  6 Comments
Jiro Doke
Jiro Doke on 15 Aug 2017
"Same method" as in using foregroundDetector in a loop with video frames?
I can't say for certain, but you may need to take the vision.ForegroundDetector initialization outside of the "loop". If I remember correctly, the detector uses past frames to estimate the background. Currently, in your snippet of code, you are recreating the detector for each frame, thus clearing the past frames from its algorithm. Just using your code snippet, you may need to change to something like this.
function playCallback(hObject,~,videoSrc,hAxes)
foregroundDetector = vision.ForegroundDetector('NumGaussians', 4, ...
'NumTrainingFrames', 60);
while strcmp(hObject.String, 'Pause') && ~isDone(videoSrc)
[frame,result] = getAndProcessFrame(videoSrc,foregroundDetector);
showFrameOnAxis(hAxes.axis1, frame);
showFrameOnAxis(hAxes.axis2, result);
end
end
function [frame,foreground] = getAndProcessFrame(videoSrc,foregroundDetector)
frame = step(videoSrc);
foreground = step(foregroundDetector, frame);
end
Leona Chan
Leona Chan on 15 Aug 2017
Yes, work now, thank you very much

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!