首页 文章

如何在循环中使用子图,imshow或图形来显示所有图像?

提问于
浏览
0

基本上,我想循环所有视频帧,从背景图像中减去每一帧,并使用子图或数字显示结果,即 subtractedImg .

vidObj = VideoReader('test3.mp4');
width = vidObj.Width;
height = vidObj.Height;

subtractedImg = zeros([width height 3]);
videoFrames = [];
k = 1;
while hasFrame(vidObj)
    f = readFrame(vidObj);
    f=uint8(f);
    videoFrames = cat(numel(size(f)) + 1, videoFrames, f);
    k = k+1;
end
backgroundImg = median(videoFrames,4);
i=1;

Problem here 我在这里使用的子图,在这个循环中不显示输出 . 仅显示一个 Headers 为"last one"的图形 .

while hasFrame(vidObj)
    frame = readFrame(vidObj);

    subtractedImg=imabsdiff(frame,backgroundImg);
    figure(i); imshow(subtractedImg);
    % subplot(5,5,i),imshow(subtractedImg); 
    %uncommenting above line does not work, subplot not shown
    if(i < 20)
    i= i+1;
    end

end %end while

subplot(1,2,1),imshow(subtractedImg),title('last one');

如何使用子图显示每个图像?例如,使用5x5子图,如果我想显示25个减影图像,为什么 subplot(5,5,i),imshow(subtractedImg); 不起作用?

2 回答

  • 0

    这应该为每个帧制作一个数字和一个新的子图:

    figure(1);clf;
    for ct = 1:size(videoFrames,4)        
        subtractedImg=imabsdiff(videoFrames(:,:,:,ct),backgroundImg);
        subplot(5,5,ct);imshow(subtractedImg); 
        if(ct == 25)
            break
        end
    end
    
  • 0

    这里要做的第一件事是在循环中删除对 figure 的调用 . 在循环之前只需调用一个数字即可 . 您可以在每次迭代时使用 clf 来清除当前图形的内容 .

    然后,您可能希望在绘图命令之后添加 drawnow 命令以在每次迭代时刷新图形 .

    最后,您可能(或不想)添加 pause 以等待帧之间的用户输入 . 请注意,如果您使用 pause ,则不需要 drawnow .

相关问题