使用MATLAB对视频进行逐帧读取
在这一周的某个深夜,我在bilibili上看到一个十分好玩的视频。聪明的up主使用MATLAB将3000多万播放量的影 流 之 主(不知道影 流 之 主的看下面的链接)视频进行逐帧读取,并用Roberts 算子对每一张帧图进行边缘检测,再次生成一张张的边缘检测图,再用这些图来合成视频,属实有趣,因此我也编写了相关代码重现了这个up的操作,具体代码如下:
读取视频帧
out2pic.m
clear;
clc;
se = strel('line',11,90);
path='D:\Matvideo\ylzz.mp4'; %视频存放路径
obj=VideoReader(path);
num=obj.NumberOfFrames;
for i=1:num %帧数,bilibili那个3000万播放量的影 流 之 主一共有398帧,因此这里的i最终为398
frame=read(obj,i);
lujing=strcat('D:\Matvideo\lunkuo\',num2str(i)); %帧图输出路径
lujing=strcat(lujing,'.jpg');
imwrite(frame,lujing)
end
对每一张帧图进行边缘检测
zed.m
close all;
clc;
for i=1:398 %前面所得的视频帧数
path='D:\Matvideo\lunkuo\'; %帧图路径
disp(i);
path=strcat(path,num2str(i));
p=strcat(path,'.jpg');
f=imread(p);
f=rgb2gray(f);
roberts=edge(f,'roberts'); %roberts算子
[m,n]=find(roberts==1);
%scatter(n,-m,'.'); % 1 去掉注释直接展示
mh=scatter(n,-m,'.'); % 2 确定输出
axis([-450 700 -750 400]); %可依据窗口大小自行调整坐标系
lujing=strcat('D:\Matvideo\robert\',num2str(i)); % 3 输出存放路径
lujing=strcat(lujing,'.jpg'); % 4 输出格式为ipg
saveas(mh,lujing); % 5 保存
%这里默认是将边缘检测的每一张图片保存,方便后续合成视频;也可以不用保存直接展示,只需将注释编号为1的语句取消注释,将2、3、4、5加上注释即可。但直接展示的话效果不太好,比较卡。
pause(0.05);
end
将检测出的图片合成为视频
pic2video.m
clear;
clc;
WriterObj=VideoWriter('master of shadow.avi', 'Uncompressed AVI'); %这里输出的路径是默认路径,合成的视频的格式是avi
%avi格式的话光是影 流 之 主那个14秒的视频都要1个多G,过于高清,可以改为mp4,这样就合成的视频比较小
%改为mp4格式只需将内容改为:VideoWriter('master of shadow.mp4', 'MPEG-4')
open(WriterObj);
for i=1:398 %帧图数量
pic='D:\Matvideo\robert\'; %前面边缘检测的图片的存储路径
pic=strcat(pic,num2str(i));
ppic=strcat(pic,'.jpg');
frame=imread(ppic); % 读取图像,放在变量frame中
disp(ppic);
writeVideo(WriterObj,frame); % 将frame放到变量WriterObj中
end
close(WriterObj);
影 流 之 主:https://www.bilibili.com/video/av62162985?from=search&seid=12457012987452727931
合成的视频:由于csdn上传不了视频,我截个图吧
难道这就是你分手的借口~