起因是刷到了视频链接: link
但是由于某些原因窝工不能使用Matlab于是打算用Mathematica复刻这个内容
第一期首先讲Mathematica的视频处理
压缩视频
导入原视频demo.mp4,直接导出为480p
电脑配置高且有耐心等的可以略过这一步
Export["C:\\Users\\compress.mp4",
Import["C:\\Users\\demo.mp4"], RasterSize -> 480]
导入视频
控制导入类型为ImageList,后面所有的图像处理都是基于图像(Image)的,而使用列表(List)串连图像
sorce = Import[
"C:\\Users\\compress.mp4", "ImageList"]
处理视频
一些因为个人水平有限写出的奇葩代码,,
使用Part命令从List中提取单个元素。具体的写法就是
List_name[[i]]
选出List里面第i个元素(计数从1开始)
用process作为中间变量,取出一幅图片进行处理
用outtemp作为输出缓存,将处理后的图片保存到ImageList里面
前面两句新建出两个List类型的变量出来
循环处理,将outtemp和process合并起来
process = {EdgeDetect[sorce[[1]]]};
outtemp = process;
For[i = 2, i < Length[sorce] + 1, i++,
process = {EdgeDetect[sorce[[i]]]};
outtemp = Join[outtemp, process]]
导出视频
导出的时候可以直接写文件名到地址位置
帧速率需要自行设置,默认应该是15帧左右
Export["C:\\Users\\output.mp4", outtemp, FrameRate -> 30]
播放视频
首先将视频生成串流信号,然后控制开始播放
这个时候是看不到输出的,需要再通过动态展示当前帧才可以看到播放的视频
v = VideoStream[
"C:\\Users\\output.mp4"];
VideoPlay[v];
Dynamic[v["CurrentFrame"]]
一口气全做对
把所有代码连起来:
在mathematica里面语句结尾打上" ; "的话这一句的结果就不会输出啦,但是可以被下一句调用,这样会比较简洁
Export["C:\\Users\\YawnFun\\Desktop\\0713\\compress.mp4",
Import["C:\\Users\\YawnFun\\Desktop\\0713\\demo.mp4"],
RasterSize -> 480];
sorce = Import["C:\\Users\\YawnFun\\Desktop\\0713\\compress.mp4",
"ImageList"];
process = {EdgeDetect[sorce[[1]]]};
outtemp = process;
For[i = 2, i < Length[sorce] + 1, i++,
process = {EdgeDetect[sorce[[i]]]};
outtemp = Join[outtemp, process]];
Export["C:\\Users\\YawnFun\\Desktop\\0713\\output.mp4", outtemp,
FrameRate -> 30];
v = VideoStream["C:\\Users\\YawnFun\\Desktop\\0713\\output.mp4"];
VideoPlay[v];
Dynamic[v["CurrentFrame"]]
工程和素材放在阿里云盘啦,有需要的朋友欢迎下载~
链接: 工程和素材下载