将视频帧

26日视图(30天)
nkumar
nkumar 2013年3月10日
评论道: 图像分析 2020年7月16日
[f p] = uigetfile ({‘* .avi‘,“AVI视频文件(* .avi)”;“选择一个AVI格式的视频”,“输入\”});
帧= mmreader ([p f]);
(框架);
nFrames = Frames.NumberOfFrames;
pickind =“jpg”;
k = 1: nFrames
% mov (k)。cdata =阅读(框架,k);
一个=阅读(框架,k);
% % % % %一些操作
strtemp = strcat (“E: \ K1frames \”int2str (k),“。”,pickind);
imwrite (strtemp);
结束
视频
t =长度(目录);
xc = 1:长度(目录)
xb = imread([路径名、目录(xc) . name]);
图中,imshow (a)、标题(“加载框架”);
外汇(:,xc) = getframe;
结束
implay(外汇,84)% 84帧
现在又如何将视频转换成帧

接受的答案

图像分析
图像分析 2013年3月10日
试试这个演示。这是它的一件事:
%演示宏观提取帧,帧意味着从一个avi电影
%和单个帧保存到单独的图像文件。
%计算平均灰度值的颜色通道。
clc;%清除命令窗口。
关闭所有;%关闭所有数据(除了imtool。)
imtool关闭所有;%关闭所有imtool数字。
清晰;%擦掉所有现有的变量。
工作空间;%确定工作区面板显示。
字形大小= 14;
%改变当前文件夹的文件夹m文件。
%(下面的代码行是Brett Shoelson Mathworks。)
如果(~ isdeployed)
cd (fileparts ((mfilename)));
结束
%打开犀牛。avi电影附带MATLAB演示。
文件夹= fullfile (matlabroot,“\工具箱\ \ imdemos图像”);
movieFullFileName = fullfile(文件夹,“rhinos.avi”);
%查看它的存在。
如果~存在(movieFullFileName“文件”)
strErrorMessage = sprintf (文件未找到:\ n % s \ nYou可以选择一个新的,或取消的,movieFullFileName);
响应= questdlg (strErrorMessage,“文件未找到”,“好了,选择一个新电影。”,“取消”,“好了,选择一个新电影。”);
如果strcmpi(反应,“好了,选择一个新电影。”)
[baseFileName, folderName FilterIndex] = uigetfile (‘* .avi‘);
如果~ isequal (baseFileName, 0)
movieFullFileName = fullfile (folderName baseFileName);
其他的
返回;
结束
其他的
返回;
结束
结束
试一试
videoObject = VideoReader (movieFullFileName)
%确定有多少帧。
numberOfFrames = videoObject.NumberOfFrames;
vidHeight = videoObject.Height;
vidWidth = videoObject.Width;
numberOfFramesWritten = 0;
%准备一个图显示屏幕的上半部分的图像。
图;
拉% =(0,'拉');
%全屏放大图。
集(gcf,“单位”,“归一化”,“outerposition”,(0 0 1 1));
%询问用户是否要写个人帧到磁盘。
promptMessage = sprintf (“你想保存单个帧单个磁盘文件?”);
按钮= questdlg (promptMessage,“拯救个人帧吗?”,“是的”,“不”,“是的”);
如果比较字符串(按钮,“是的”)
writeToDisk = true;
%提取的各个部分文件名。
[文件夹,baseFileName,延续]= fileparts (movieFullFileName);
%组成一个特殊的新的输出所有单独的子文件夹
%电影帧我们要提取并保存到磁盘。
%(别担心- windows可以处理正斜杠在文件夹的名字。)
文件夹= pwd;%文件夹的子文件夹这个m文件的生活。
outputFolder = sprintf (“从% s % s /电影帧”、文件夹、baseFileName);
%如果它不存在已经创建文件夹。
如果~存在(outputFolder“dir”)
mkdir (outputFolder);
结束
其他的
writeToDisk = false;
结束
%循环通过电影,写所有帧。
%每一帧将在一个单独的文件具有独特的名字。
meanGrayLevels = 0 (numberOfFrames, 1);
meanRedLevels = 0 (numberOfFrames, 1);
meanGreenLevels = 0 (numberOfFrames, 1);
meanBlueLevels = 0 (numberOfFrames, 1);
帧= 1:numberOfFrames
%从电影中提取帧结构。
thisFrame =阅读(videoObject,框架);
%显示它
hImage =次要情节(2 2 1);
图像(thisFrame);
标题= sprintf (%的4 d % d帧。帧,numberOfFrames);
标题(标题,“字形大小”、字形大小);
drawnow;%强制刷新窗口。
%图像数组写入输出文件,如果要求。
如果writeToDisk
%构造一个输出图像文件的名字。
outputBaseFileName = sprintf (“帧% 4.4 d.png”、框架);
outputFullFileName = fullfile (outputFolder outputBaseFileName);
%邮票的名称和帧数上的形象。
%在这一点上它只是进入覆盖,
%没有被写入了像素值。
文本(outputBaseFileName 5日,15日,“字形大小”,20);
%提取图像与文本“燃烧”。
frameWithText = getframe (gca);
% frameWithText。cdata图像与文本
%写像素值。
%写出来到磁盘。
imwrite (frameWithText。cdata, outputFullFileName“png”);
结束
%计算平均灰度。
grayImage = rgb2gray (thisFrame);
meanGrayLevels(帧)=意味着(grayImage (:));
%计算平均R, G, B的水平。
meanRedLevels(帧)=平均(平均(thisFrame (:,: 1)));
meanGreenLevels(帧)=平均(平均(thisFrame (:,: 2)));
meanBlueLevels(帧)=平均(平均(thisFrame (:,:, 3)));
%画出的意思是灰色的水平。
hPlot =情节(2 2 2);
持有;
情节(meanGrayLevels“k -”,“线宽”2);
持有;
情节(meanRedLevels的r -);
情节(meanGreenLevels“g -”);
情节(meanBlueLevels“b -”);
网格;
%把标题后面因为情节()擦除现有的标题。
标题(“意思是灰色的水平”,“字形大小”、字形大小);
如果帧= = 1
包含(的帧数);
ylabel (“灰度”);
%得到大小预先配置的数据后,如果我们读
%的电影从磁盘。
[行列numberOfColorChannels] =大小(thisFrame);
结束
%更新用户与进步。在命令窗口中显示。
如果writeToDisk
progressIndication = sprintf (帧% d % 4 d写道。帧,numberOfFrames);
其他的
progressIndication = sprintf (“处理帧% % d的4 d。帧,numberOfFrames);
结束
disp (progressIndication);
%增加帧数(最终应该= numberOfFrames
%,除非发生了一个错误)。
numberOfFramesWritten = numberOfFramesWritten + 1;
现在让我们做差分的百分比
α= 0.5;
如果帧= = 1
背景= thisFrame;
其他的
在每一帧背景稍微变化百分比
%的背景(t + 1) =(1α)*我+α*背景
背景thisFrame +α=(1α)* *背景;
结束
%显示/适应背景变化。
次要情节(2、2、3);
imshow(背景);
标题(自适应背景的,“字形大小”、字形大小);
%计算帧与背景之间的区别。
differenceImage = thisFrame - uint8(背景);
%和大津法阈值。
grayImage = rgb2gray (differenceImage);%转换为灰度
thresholdLevel = graythresh (grayImage);%得到阈值。
binaryImage = im2bw (grayImage thresholdLevel);%的二值化
%画出二进制图像。
次要情节(2、2、4);
imshow (binaryImage);
标题(“图像的关键区别”,“字形大小”、字形大小);
结束
%提醒用户,我们就完成了。
如果writeToDisk
finishedMessage = sprintf (“做!它写了% d帧文件夹\ n“% s”、numberOfFramesWritten outputFolder);
其他的
finishedMessage = sprintf (“做!它处理% d帧\ n“% s”的、numberOfFramesWritten movieFullFileName);
结束
disp (finishedMessage);%写入命令窗口。
uiwait(对话框(finishedMessage));%也弹出一个消息框。
%的退出,如果他们没有写任何单个帧到磁盘。
如果~ writeToDisk
返回;
结束
%询问用户是否要从磁盘读取单个帧,
%,他们只是写出来,回到电影和显示它。
promptMessage = sprintf ('你要记得各个帧\ nback从磁盘成电影?\ n(这需要几秒钟)。);
按钮= questdlg (promptMessage,“记得电影吗?”,“是的”,“不”,“是的”);
如果比较字符串(按钮,“不”)
返回;
结束
%读回帧,将它们转换为电影。
%的任何方式我不知道preallocate recalledMovie。
帧= 1:numberOfFrames
%构造一个输出图像文件的名字。
outputBaseFileName = sprintf (“帧% 4.4 d.png”、框架);
outputFullFileName = fullfile (outputFolder outputBaseFileName);
%从磁盘读取的图像。
thisFrame = imread (outputFullFileName);
%将图像转换成一个“电影框架”结构。
recalledMovie(帧)= im2frame (thisFrame);
结束
%摆脱旧形象和情节。
删除(hImage);
删除(hPlot);
%为影片创造新的轴。
次要情节(1、3、2);
;%关闭轴数字。
标题(“电影回忆从磁盘”,“字形大小”、字形大小);
%播放电影的轴。
电影(recalledMovie);
%注意:如果你想在叠加显示图形或文本
%的电影回放你需要像我一样
%(这个文件的顶部,你提取和imshow框架。)
对话框(“用这个演示!”);
%如果你这里发生了一些错误。
stError = lasterror;
strErrorMessage = sprintf (的错误帧提取电影:\ n \ n % s \ n \ nError: % s \ n \ n) '、movieFullFileName stError.message);
uiwait(对话框(strErrorMessage));
结束
2的评论
图像分析
图像分析 2020年7月16日
在命令行中键入videoObject并查看它的属性。我认为他们,出于某种原因,改变了属性名NumberOfFrames NumFrames。

登录置评。

答案(1)

AJ
AJ 2013年6月13日
我只能从视频中提取80帧。我只是使用的那部分代码用于提取帧。不是平均灰度值。好心的帮助

标签

s manbetx 845

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!