效果展示
最近很火的用matlab对练习时长两年半的cxk的唱跳rap视频进行边缘检测,然后合成视频,趣称练习时长两年半的matlab。下面是效果图奉上。
代码实现
那具体是怎么实现的呢?让我们给出代码和解释。
代码可分为三块,第一块是将视频按帧读取成多张图片然后保存到文件夹中。
se = strel('line',11,90);
path_src='C:\matlab_ws\src.mp4'; %源视频存放路径
obj=VideoReader(path_src);
num=obj.NumberOfFrames;
pathImgOut='.\ImgOut\'%视频拆分为图片的存储路径
%一帧一帧的读取并存储到 pathImgOut
for i=1:num
frame=read(obj,i);
lujing=strcat(pathImgOut,num2str(i));
lujing=strcat(lujing,'.jpg');
imwrite(frame,lujing)
end
第二块是利用matlab的边缘检测函数对上面得到的多张照片进行边缘检测,检测算法的选择较多,有robert,sobel prewitt,laplacian,canny等,各种算法有不同的特点和适用情况,这里不做展开介绍,详情可以看下面给出的参考链接。如果只是单纯的为了整活,随便选一种即可。之后把检测得到的图像结果保存到另一个文件夹中。
matlab边缘检测算子:https://blog.csdn.net/weixin_36815313/article/details/109899559
pathImgOut2='.\ImgOut2\'%图片边缘检测图片的存储路径
for i=1:num
path_src=strcat(pathImgOut,num2str(i));
p=strcat(path_src,'.jpg');
f=imread(p);
f=rgb2gray(f);
roberts=edge(f,'roberts'); %roberts算子
[m,n]=find(roberts==1);
mh=scatter(n,-m,'.');
lujing=strcat(pathImgOut2,num2str(i));
lujing=strcat(lujing,'.jpg');
saveas(mh,lujing);
end
第三块是把第二块得到的边缘检测图像拼成一段视频,最终就是我们想要的视频。
WriterObj=VideoWriter('kbj','MPEG-4')
open(WriterObj);
for i=1:num %帧图数量
pic=strcat(pathImgOut2,num2str(i));
ppic=strcat(pic,'.jpg');
frame=imread(ppic); % 读取图像,放在变量frame中
writeVideo(WriterObj,frame); % 将frame放到变量WriterObj中
end
close(WriterObj);
合成的视频没有音频,如果需要音频大家可以去一些视频剪辑软件添加音频即可。
下面供上完整代码。
%% 第一部分
clear;
clc;
se = strel('line',11,90);
path_src='C:\matlab_ws\src.mp4'; %源视频存放路径
obj=VideoReader(path_src);
num=obj.NumberOfFrames;
pathImgOut='.\ImgOut\'%视频拆分为图片的存储路径
%一帧一帧的读取并存储到 pathImgOut
for i=1:num
frame=read(obj,i);
lujing=strcat(pathImgOut,num2str(i));
lujing=strcat(lujing,'.jpg');
imwrite(frame,lujing)
end
%% 第二部分
pathImgOut2='.\ImgOut2\'%图片边缘检测图片的存储路径
for i=1:num
path_src=strcat(pathImgOut,num2str(i));
p=strcat(path_src,'.jpg');
f=imread(p);
f=rgb2gray(f);
roberts=edge(f,'roberts'); %roberts算子
[m,n]=find(roberts==1);
mh=scatter(n,-m,'.');
lujing=strcat(pathImgOut2,num2str(i));
lujing=strcat(lujing,'.jpg');
saveas(mh,lujing);
end
%% 第三部分
WriterObj=VideoWriter('kbj','MPEG-4')
open(WriterObj);
for i=1:num %帧图数量
pic=strcat(pathImgOut2,num2str(i));
ppic=strcat(pic,'.jpg');
frame=imread(ppic); % 读取图像,放在变量frame中
writeVideo(WriterObj,frame); % 将frame放到变量WriterObj中
end
close(WriterObj);