Matlab中对图像和视频流的读取还是很方便的,但是由于不常用Matlab读取视频流(这家伙处理能力较OpenCV还是慢些)偶有小忘,这次有在工作中遇到特此记录一下,Matlab的help文档关于视频流的读取讲解的比较少,但还好经过网上查阅和实践做了一些整理,算是熟悉了,在读取视频这个过程主要用到了三个函数:1、VideoReader,这个也可以认为是个视频读取类,用于构造要读取的视频文件;2、hasFrame函数用于判断视频中还有没有帧,有就接着读,没有就退出;3、 readFrame用于读取图像帧文件;其他的函数不做解释。直接上代码:

function Video2Image(VideoPath,ImageSaveFolder,ImNamePre,ImSpanNum)

ImageSaveForm='.jpg';

ImStartId=20;

ObjImSize=[480,640];

%获取视频信息

vidObj= VideoReader(VideoPath);

vidHeight = vidObj.Height;

vidWidth = vidObj.Width;

%创造一个存储视频的结构体

s = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),...

'colormap',[]);

%先把视频每一帧信息记录下来

k = 1;

while hasFrame(vidObj)

s(k).cdata = readFrame(vidObj);

k = k+1;

end

%把上面保存的信息写入图片中去

if ~exist(ImageSaveFolder,'dir')

mkdir(ImageSaveFolder);

end

for i=ImStartId:ImSpanNum:k-1

%取出结构体中一张图片信息

Image=s(i).cdata;

Image=imresize(Image,ObjImSize);

%按指定格式保存到指定的文件夹

ImageName=sprintf('%s-%d.%s',ImNamePre,i,ImageSaveForm);

ImagePath=fullfile(ImageSaveFolder,ImageName);

imwrite(Image,ImagePath);

end

end

下面举一个我在读取多个视频的程序:

首先看一下我的文件结构:每一个主文件夹下有三个子文件夹,每个子文件夹下又有四个视频文件:

 

因此要自动把主文件下的三个子文件夹下的视频流都自动读取,程序如下:

%2018/09/18 by DQ

function ExtractVideoIm()

clc;

close all;

FanFolder='H:\BaiduNetdiskDownload\1-011';

ImSpanNum=30;%抽取视频帧的间隔数

WindSiteName='YYMS';

SaveWindSiteFolder=fullfile('C:\Users\Administrator\Desktop\ImBigSet',WindSiteName);%%图片保存的主文件夹

if ~exist(SaveWindSiteFolder,'dir')

mkdir(SaveWindSiteFolder);

end

[~,PreFanName,~] = fileparts(FanFolder);

SaveFanFolder=fullfile(SaveWindSiteFolder,PreFanName);

if ~exist(SaveFanFolder,'dir')

mkdir(SaveFanFolder);

end

SplitStr=strsplit(PreFanName(2:end),'-');

FirstNum=SplitStr{1};

SecondNum=num2str(str2num(SplitStr{2}));

FanName=strcat(FirstNum,'0',SecondNum);

BladeFolderSet=dir(FanFolder);

BladeFolderNum=length(BladeFolderSet);

for i=3:BladeFolderNum

BladeName=BladeFolderSet(i).name;

SaveBladeFolder=fullfile(SaveFanFolder,BladeName);

if ~exist(SaveBladeFolder,'dir')

mkdir(SaveBladeFolder);

end

BladeFolder=fullfile(FanFolder,BladeName);

VideoSet=dir(BladeFolder);

VideoNum=length(VideoSet);

for j=3:VideoNum

VideoName=VideoSet(j).name;

VideoNameNum=strsplit(VideoName(1:end-4),'_');

VideoId=VideoNameNum{2};

SaveVideoFolder=fullfile(SaveBladeFolder,VideoName);

if exist(SaveVideoFolder,'dir')

fprintf('%s existed,please check\n',SaveVideoFolder);

return;

else

mkdir(SaveVideoFolder);

end

VideoPath=fullfile(BladeFolder,VideoName);

ImNamePre=sprintf('%s%s-%s-%s',WindSiteName,FanName,BladeName,VideoId);

Video2Image(VideoPath,SaveVideoFolder,ImNamePre,ImSpanNum);

fprintf('Completely %s %s %s\n',PreFanName,BladeName,VideoName);

end

end

end

好了至此就算完成了这些视频流读取保存成图片,但是啦在这中间又遇到了一些问题,程序能正确完成任务,主要是视频流的读取太他妈费时了,以至于有时cpu满负荷,这应该不是matlab做的不好,估计是哪里写的不对。经过查阅终于找到了这个问题的根源,原始是提取视频流中的这几条句:

while hasFrame(vidObj)

s(k).cdata = readFrame(vidObj);

k = k+1;

end

这几条语句因为记录下所有视频帧文件,所以自然很消耗资源,这个我可是照着matlab中的Help文档来的,文档当然没错,只是在这里不太合适,我们只需要提取视频帧,没不需要做一些其他处理,没必要把这些数据存储为matlab方便的数据格式,我们只需要读一帧就保存一下就好了,修改后的代码如下:

function Video2Image2(VideoPath,ImageSaveFolder,ImNamePre,ImSpanNum,StartId)

ImageSaveForm='.jpg';

ObjImSize=[480,640];

%获取视频信息

vidObj= VideoReader(VideoPath);

%把上面保存的信息写入图片中去

if ~exist(ImageSaveFolder,'dir')

mkdir(ImageSaveFolder);

end

IsExtractPointStartId=false;%从指定的帧号开始提取图片

CurFrameId=0;

PreFrameId=0;

while hasFrame(vidObj)

Image = readFrame(vidObj);

CurFrameId=CurFrameId+1;

if (~IsExtractPointStartId)&&(CurFrameId==StartId)

IsExtractPointStartId=true;

PreFrameId=CurFrameId;

Image=imresize(Image,ObjImSize);

%按指定格式保存到指定的文件夹

ImageName=sprintf('%s-%d%s',ImNamePre,CurFrameId,ImageSaveForm);

ImagePath=fullfile(ImageSaveFolder,ImageName);

imwrite(Image,ImagePath);

continue;

end

if ((CurFrameId-PreFrameId)==ImSpanNum)

PreFrameId=CurFrameId;

Image=imresize(Image,ObjImSize);

%按指定格式保存到指定的文件夹

ImageName=sprintf('%s-%d%s',ImNamePre,CurFrameId,ImageSaveForm);

ImagePath=fullfile(ImageSaveFolder,ImageName);

imwrite(Image,ImagePath);

end

end

end

好了,修改后的程序读取视频流还是比较快的,下面再附带了一个读取单个视频流文件的源码:

%2018/09/18 by DQ

%%从指定的帧号按指定间隔数抽取某单个视频帧

function ExtractPointSingleVideoImForAnot22()

tic;

clc;

close all;

VideoFolder='H:\BaiduNetdiskDownload\YYMS\33\3';

VideoName='DJI_0057.mp4';

WindSiteName='SDB';

ImSpanNum=30;

StartId=10;

VideoNameNum=strsplit(VideoName(1:end-4),'_');

VideoId=VideoNameNum{2};

SplitCell=strsplit(VideoFolder,'\');

FanName=SplitCell{end-1};

BladeName=SplitCell{end};

SaveWindSiteFolder=fullfile('C:\Users\Administrator\Desktop\ImBigSet',WindSiteName);

if ~exist(SaveWindSiteFolder,'dir')

mkdir(SaveWindSiteFolder);

end

SaveFanFolder=fullfile(SaveWindSiteFolder,FanName);

if ~exist(SaveFanFolder,'dir')

mkdir(SaveFanFolder);

end

SaveBladeFolder=fullfile(SaveFanFolder,BladeName);

if ~exist(SaveBladeFolder,'dir')

mkdir(SaveBladeFolder);

end

SaveVideoFolder=fullfile(SaveBladeFolder,VideoName);

if exist(SaveVideoFolder,'dir')

fprintf('%s existed,please check\n',SaveVideoFolder);

return;

else

mkdir(SaveVideoFolder);

end

VideoPath=fullfile(VideoFolder,VideoName);

ImNamePre=sprintf('%s%s-%s-%s',WindSiteName,FanName,BladeName,VideoId);

Video2Image2(VideoPath,SaveVideoFolder,ImNamePre,ImSpanNum,StartId)

fprintf('Completely %s %s %s\n',FanName,BladeName,VideoName);

toc;

end

好了matlab读取视频流文件的过程就是这样

matlab网页视频流,使用Matlab读取视频流文件相关推荐

  1. 使用matlab的MAT.H(c读取mat文件)

    使用matlab的MAT.H(c读取mat文件) 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Mark ...

  2. [mac]matlab for mac —关于无法读取avi文件的解决方法

    今天上课,老师让我们做运动物体识别,给了我们一个avi格式的视频,班上的同学都用学校提供的windows的虚拟机上的matlab来运行,可实在是速度太慢了.自己早早就下载了mac版本的matlab.可 ...

  3. 用matlab处理grib2,关于Matlab2017b读取GRIB2文件的问题

    由于经常需要处理grib2格式的大气海洋数据,因此,经常用到用于读取nc.hdf.grib等数据的Matlab工具箱:nctoolbox和snctools.Matlab版本升级为Matlab2017b ...

  4. 用matlab读csv数据_Matlab读取csv文件csvread函数的使用

    3.7 (3) 今天来说下如何使用Matlab读取excel的csv文件,这个有什么用呢?想必理科生大概率都会用到示波器,去抓取一些电信号或者光信号,我们从示波器导出来的就是csv文件或者图片文件,而 ...

  5. MATLAB中利用ncread函数读取nc文件

    MATLAB读取NC文件 一. 目的: 了解NETCDF文件,学会利用MATLAB读取NETCDF文件 二.  撰写时间 开始时间:2016年12月03日 完成时间:2016年12月09日 三.知识储 ...

  6. MATLAB怎么使用table格式读取csv文件并画图

    MATLAB中新增了一个table类型,可以很方便的读取文件中的数据,在使用这个格式的时候会默认把读取文件的第一行设置为标题,访问的时候需要通过索引值进行访问,具体怎么操作通过一个MATLAB例子进行 ...

  7. MATLAB系列(3)——读取txt文件

    不啰嗦,直接上代码上图: fid4=fopen('XXX\data.txt','r');%open the document data4=textscan(fid4,'%s '); fclose(fi ...

  8. matlab引用csv文件,如何用MATLAB读取csv文件

    如何使用Matlab读取csv文件 在Matlab中,有专门读取csv文件的函数:csvread().在Matlab的帮助文档中,有对这个函数的详细解释. csvread()函数有三种使用方法: 1. ...

  9. 怎么退出python命令行cd找到txt文档_《python怎么读取txt文件》

    python怎么创建一个txt文件 python怎么创建txt文件的方法. 如下参考: 1.首用内置的空闲编辑器编辑(单击并选择copy),如下图所示. 2.您可以下载记事本和其他编辑软件,以支持多种 ...

最新文章

  1. 多伦多大学2020春季CSC311课程「机器学习导论」课件PPT
  2. python系统-python 系统相关操作
  3. 你真的懂用户画像吗?
  4. springmvc学习笔记--Interceptor机制和实践
  5. Android—将Bitmap图片保存到SD卡目录下或者指定目录
  6. php编程对联,形容程序员的对联大全
  7. JLOI2016 方
  8. STM32的学习记录--2.WiFi模块的使用
  9. 远程办公一晃一天,环境搭建履步维艰
  10. UIView layer 的对应关系
  11. java执行cmd命令并获取返回结果字符串
  12. js简单操作Cookie
  13. win10 字体 变得模糊 有锯齿
  14. feishu-飞书api
  15. 家具生产设备_家具生产线
  16. 最后一本书 第六章课后练习3,4
  17. Apriltag编解码系统
  18. 【方法篇·壹】css开发技巧-全局样式设置和局部样式
  19. 2021年6月大学英语六级作文
  20. HCIA 学习笔记 (26-37) 静态路由、RIP、OSPF

热门文章

  1. ClickHouse MergeTree表引擎和建表语句
  2. Selective Search原理及实现
  3. 搜狗可能算不上什么“好商品”
  4. LocalDateTime 的用法
  5. wor2007添加分节符
  6. python学习每日一题【20200226】python实现“分解质因数”的计算
  7. t版免费申请esim
  8. js代码 实现购物车功能
  9. python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例
  10. K-means算法及文本聚类实践