1、将视频转化成图片
视频是在B站下载的FLV格式的,然后我采用网上找的python代码将视频转成了1078张图片。
2、处理图片
因为老师给的代码一次只能处理一张图片,且处理后的图片名固定为st.jpg,而且貌似不太方便将输入时的文件名在输出时读出来,所以我想法是直接他输出的文件名为随机的,这样一来不会导致覆盖,二来可以通过生成文件的时间戳来进行排序。
后来我探索了几种方法,以下是总结的两种。嫌麻烦的话,可以直接看2.2, 2.1是在硬件上做的,出的问题比较多比较麻烦。
2.1、方法一
看了给的源码,我改了src下面的post_processor.cpp中的代码。使其输出的文件名不唯一,是随机的字符串,输出文件统一放到一个out文件夹下,这个out文件夹需要手动创建,与src文件夹同级。
以下是部分截图 :
修改完post_processor.cpp后,在服务器端进入Cambricon-Test文件夹,设置环境,X86貌似不用设置,但是ARM的话,一定要设置,不然make代码的时候,会报错。
cd Cambricon-Test
source env.sh
经过环境设置后,然后进入style_transfer_x86/build文件夹,命令行输入
cmake …
make
编译完成后,就可以让输出的图片名是随机的了。然后我们再去改run_style_transfer.sh,让他可以处理多个图片,这里我是重新创建了一个1.sh文件。
改完之后,连上寒武纪的ARM板子,处理:
ping 10.100.8.234
telnet 10.100.8.234
mount -t nfs -o tcp,nolock 10.100.8.235:/opt/Cambricon/nfs /NFS
cd NFS
export LD_LIBRARY_PATH=/NFS/lib32
cd style_transfer_arm/
sh 1.sh
运行结束后,就可以在out文件夹下看到1478张处理后的图片,但是文件夹里面的文件名都是随机的、混乱的,所以我们要按照他们生成的时间戳来对其排序,在out文件夹创建一个operation.sh
然后打开终端,cd 到out文件夹下,然后输入
sh operation.sh
稍等片刻,就处理完了,图片名全部成了生成时的字符串。
然后将out文件夹,复制出虚拟机,放到电脑桌面,然后全选所有图片,再按空格,再用鼠标左键点击文件夹空白处,所有的图片就会按照顺序排列。
2.2、处理图片
上面方法我试了不下十次,花了两天,结果不是板子上报错,就是处理的图片没有1478张,所以,我后来选择在服务器上操作了。
换了一个思路,改文件名的方法老是出各种问题,导致出来的图片数量没那么多。于是,我想到了直接写一个shell,在每次程序出一个st.jpg图片之后,就马上将那个图片重名为输入的名。
首先,在src同级目录下,新建一个out文件夹,放处理后的图片,然后新建一个1.sh,
代码如下:
然后在服务器端,
sh 1.sh
就在out处获得了处理后的图片,我还让处理的结果输入到1.text,看是否有漏掉的。
3、做成视频
我是用AE做成视频的,所以这里说下流程,其他软件流程应该是相似的。
打开AE后,点击文件,导入,多个文件,然后选择 JPEG序列 ,然后得到序列后,将序列从项目框下,拖动到合成的那个轨道上,然后导入最初的FLV视频,放到视频轨道上,关闭视频,打开音频。
我们发现原视频是59:04,但是图片序列只有49:08,所以需要将图片序列的时间等比增加,故点击合成框的左下角的 {} 符号,然后合成框会多一个持续时间、伸缩,然后点击持续时间,会弹出一个框,将里面的49:08改成59:04。
接着点击顶部菜单栏中的合成,点击 添加到渲染队列,然后在下方会看到一个渲染队列框。这里点击渲染,就可以得到视频了,但是这样输出的视频很大,有一个多G,所以需要让输出的视频很小。
点击输出模块对应的 无损 ,然后将格式改为QuickTime,然后点击右边的 格式选项,将视频编解码器,设置为H.264,然后确定,渲染,就可以得到想要的视频啦。
具体操作图如下:
4、视频结果
欢迎大家去点赞、评论、收藏。
https://www.bilibili.com/video/av53303275/