Matlab图像边缘检测制作视频
用Matlab来进行图像边缘检测,输出边缘线条视频,过程全记录,内含全部源码。
效果
放在了我的b站上:我用Matlab摆烂了你的AE作业_哔哩哔哩_bilibili
下面可以直接观看:
源视频在这里: AE原作:大二AE结课作业 《过 年》(已摆烂)_哔哩哔哩_bilibili
b站上其他版本:《友 商 链 接》:
我用Matlab摆烂了你的AE作业_哔哩哔哩_bilibili (他是红色的
我用Matlab摆烂了你的ae作业_哔哩哔哩_bilibili (黑色,点更细致了
我用Matlab摆烂了你的ae作业_哔哩哔哩_bilibili (这个跟第一个差不多,甚至个人感觉比第一个要清晰,但是没有第一个火,第一个比这个早发布六小时,那这样说我岂不是更加凉凉了。。。
如何制作
吃瓜的到这里可以走了(若想当个故事看也不是不行),有matlab的同学想玩一玩可以往下看,源码全分享。(这里不讲怎么下载matlab,为此专门下载30G大小的matlab不划算。)
1 工作目录
创建edges
和pics
两个空文件夹,pics
是视频逐帧输出后的图片存放的路径,edges
是pics
文件夹中图片经边缘处理后生成图片的存放路径。
out2pic.m
,zed.m
和pic2video.m
三个matlab脚本文件
放入source.mp4
原视频
output.mp4
是处理后生成的视频
2 源码
源码是我从网上搜来的,改了一点,但是那是好几十天前的事情了,原网站我已经找不到了,侵删。其实我把代码放网上搜了一下确实搜到一个,但那个和我最初参考的不一样,他也没放源码链接,我也不知道哪个是原创,反正代码我不是原创。但是本文章的内容确实是原创。天下代码一大抄
代码中 “你的工作路径” 要替换为自己的,就是上图中的文件存放在哪里了。例如我的是
D:\0programing\matlab_work\ImageEdgeDetection
zed.m
和pic2video.m
代码中的for循环用到了帧数,要根据具体视频来改变,运行完out2pic.m
后,pics
文件夹中有几张图片就是几帧。
2.1 out2pic.m
:将视频分割逐帧分割为图片
1 | clear; |
2.2 zed.m
:逐个图片运用边缘检测算法
1 | close all; |
9:28开始运行边缘检测算法,10:15运行结束,1801张图片跑了四五十分钟,最后可以生成一分多钟的视频。
2.3 pic2video.m
:将生成的边缘检测图片合成视频
1 | clear; |
至此,视频合成好了,但是没有声音,用剪辑软件添加声音。
3 遇到的问题
3.1 运行zed.m
时弹出的figure窗口不要关闭!!!
别问我怎么知道的,说多了都是泪……
这个是figure窗口:
这个是可能报的错:
千万别关!!!!
3.2 合成视频时图片分辨率不符报错
查一下472.jpg和473.jpg的分辨率属性
我也不知道什么原因,原图都是1280x720,可能上面我图中关闭了一下figure导致的?但是我关闭窗口的时候应该没合成到472吧。472及以前的分辨率是875x656,473及以后的分辨率是875x657。给writeVideo
整不会了,罢工了。
再跑一遍zed.m
是不可能的,累死。机智如我,把前472张合成一下output1.mp4
,473后面的合成一个output2.mp4
,通过控制pic2video.m
中for循环i的取值来实现,记得合成后改名,不然合成第二个会覆盖第一个。之后用剪辑软件拼接起来,就算前后两个视频分辨率不同,剪辑软件可不会像writeVideo
那样罢工。
3.3 合成视频后与原视频帧数不符
合成视频发现它短了,查属性,发现原视频是25帧的,我输出的是30帧的。
网上查了一下怎么改VideoWriter
输出的帧数,代码里加了一行。
再次输出视频,帧数还为30,离谱。。。幸好我慧眼如炬,发现我从网上抄的代码和原来的代码大小写不一样,如下:(我不说你们也发现不了W和w不一样吧
1 | WriterObj=VideoWriter('output.mp4', 'MPEG-4'); |
改了以后代码运行正常(上面给的源码已经是修改过的了,放心食用。
4 待改进
在只有matlab进程的条件下:
CPU利用率:
GPU利用率:
我也不知道怎么能把CPU占满一点,也不知道怎么调用GPU来处理,产出个一分钟的视频要操作将近一个小时,辛苦我的CPU了。
这是本站第一篇实质性内容的文章,实操的小伙伴遇到什么问题可以在评论区留言。