我有一个约200帧的视频。我想捕获每第10帧,对其进行一些图像处理并显示原始图像以及绘图(在我的图像处理步骤之后)。输出应该是第10帧及其绘图,并且只有在我单击按钮后才能继续进行并在第20帧上进行处理,显示它等等。一旦我得到了所需的帧,例如。第180帧,我想显示到达该帧所经过的总时间(如果帧速率是10帧/秒,那么它应该显示18秒)。
直到现在我正在处理单独的帧并对它们进行图像处理并手动计算结果。但是GUI会使这个过程更有效率
答案 0 :(得分:1)
整洁的问题。这是你可以做的:
filelist = dir('*.bmp')
)获取您工作的文件夹中所有图像文件的列表。handles.filelist = filelist
。当您使用它时,添加另一个句柄值来保存当前图像索引handles.frameindex = 1
,稍后您将需要它。不要忘记之后更新guidata!在按钮的按下回调功能中,执行以下操作:
filelist = handles.filelist;
frameindex = handles.frameindex;
currentframefile = filelist(frameindex);
handles.frameindex = frameindex+1;
将currentframefile(包含当前帧名称的字符串)与现有GUI一起使用。
如果我理解正确的话,这应该回答你的问题。如果您需要澄清,请告诉我。祝你好运!
答案 1 :(得分:0)
你的问题非常直截了当 您将需要迭代处理图像所需的每第10帧。
您可以使用子图功能在一个图中绘制不同的数字。
subplot(n,m,p) = takes 3 arguments
n = number of rows
m = number of columns
p = location of current figure (from left to right , top to bottom flow)
因此subplot(1,2,2)
将一个数字分成两部分(单行和两列)并在第二列中绘制一个数字。
waitforbuttonpress
将允许您暂停屏幕,直到您在图上单击鼠标或按任意键。
幸运的是,我做了一些非常相似的事情。我改变了一些代码,我认为这就是你要做的事情。
由于评论......
,代码是自我解释的% get a video file
[f, p] = uigetfile({'*.avi'});
% create a video reader object.
frames = VideoReader([p,f]);
get(frames);
% get the framerate of video
fps = frames.FrameRate;
% get the number of frames in video
nframes = frames.NumberOfFrames;
pickind = 'jpg';
% create a figure to plot on
figure,
% iterate for each 10th frame in image (in step of 10)
for i = 10:10:nframes
%Use your fps to calculate time elasped
disp('Time Elasped:');
disp(i/fps);
% read a frame to image
I = read(frames, i);
% in first row & first column 1st plot will be the original image
% itself
subplot(1,2,1);
imshow(I) ;
% in first row & second column 2nd plot will be a graph of
% processed image (do your image processing here)
subplot(1,2,2);
imhist(rgb2gray(I));
% Hit a key to process next 10th frame from video
k = waitforbuttonpress ;
end
%close the figure
close
为了正确注释你的情节,请了解figures, plots and subplots
,因为matlab文档中有很多材料。
快乐学习