一、前言
请务必看到最后。Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛。前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视频换一个不同的场景,于是就有了今天的文章。
我们先看看能实现什么效果,先来个正常版的,先看看原场景:
下面是我们切换场景后的样子:
看起来效果还是不错的,有了这个我们就可以随意切换场景,坟头蹦迪不是梦。另外,我们再来看看另外一种效果,相比之下要狂放许多:
光理论是不够的,在此送大家一套2020Pyhon学习手册(第4版)、Python开发技术详解链接、PYTHON网络爬虫从入门到实践、Python爬虫开发与项目实战,需要的小伙伴可以扫描下方二维码来免费获取!
我们都知道,视频是有一帧一帧的画面组成的,每一帧都是一张图片,我们要实现对视频的修改就需要对视屏中每一帧画面进行修改。所以在最开始,我们需要获取视频每一帧画面。
在我们获取帧之后,需要抠取画面中的人物。
抠取人物之后,就需要读取我们的场景图片了,在上面的例子中背景都是静态的,所以我们只需要读取一次场景。在读取场景之后我们切换每一帧画面的场景,并写入新的视频。
这时候我们只是生成了一个视频,我们还需要添加音频。而音频就是我们的原视频中的音频,我们读取音频,并给新视频设置音频就好了。
具体步骤如下:
读取视频,获取每一帧画面
批量抠图
读取场景图片
对每一帧画面进行场景切换
写入视频
读取原视频的音频
给新视频设置音频
因为上面的步骤还是比较耗时的,所以我在视频完成后通过邮箱发送通知,告诉我视频制作完成。
三、模块安装
我们需要使用到的模块主要有如下几个:
四、具体实现 我们导入如下包:
(1)读取视频,获取每一帧画面
在OpenCV中提供了读取帧的函数,我们只需要使用VideoCapture类读取视频,然后调用read函数读取帧,read方法返回两个参数,ret为是否有下一帧,frame为当前帧的ndarray对象。完整代码如下:
1|frame_name = math.pow(10, len(frame_num))
这样做是为了让画面逐帧排序,这样读取的时候就不会乱。另外我们获取了视频的帧率和分辨率,这两个参数在我们创建视频时需要用到。这里需要注意的是opencv3.0以下版本获取帧率和画面大小的写法有些许差别。
(2)批量抠图
批量抠图需要用到paddlehub中的模型库,代码很简单,这里就不多说了:
(3)读取场景图片 这也是简单的图片读取,我们使用pillow中的Image对象:
(4)对每一帧画面进行场景切换 简单来说就是将抠好的图片和背景图片合并,我们知道抠好的图片都在humanseg_output目录,这也就是为什么最开始要准备相应的变量存储该目录的原因:
在标处,我们复制了背景,如果少了这一步的话,生成的就是我们上面的“千手观音效果”了。 其它步骤都很好理解,只有返回值比较长,我们来详细看一下:
(5)写入视频 为了节约空间,我并非等将写入图片放在合并场景后面,而是边合并场景边写入视频:
(6)读取原视频的音频 因为在opencv中没找到音频相关的处理,所以选用moviepy,使用起来也非常方便:
(7)给新视频设置音频 这里同样使用moviepy,传入视频名称和音频对象进行混流:
其中output_video是我们在最开始定义的变量。
(8)删除过渡文件 在我们生产视频时,会产生许多过渡文件,在视频合成后我们将它们删除:
最后就是将整个流程整合一下。
(9)整合 我们将上面完整的流程合并成一个函数:
(10)在main中调用 我们可以把前面定义的路径也放进了:
这样我们就完成了完整的流程。
五、发送邮件 邮件的发送又是属于另外的内容了,我定义了一个mail.py文件,具体代码如下:
里面的邮箱我是直接写死了,大家可以自由发挥。为了方便,推荐发件人使用163邮箱,收件人使用QQ邮箱。另外在登录的时候直接使用密码比较方便,但是有安全隐患。
最后送大家一套2020最新Pyhon学习手册(第4版)、Python开发技术详解链接、PYTHON网络爬虫从入门到实践、Python爬虫开发与项目实战, 扫描下面二维码来免费获取吧,希望大家一起进步哦!
另外程序设计还是有许多不合理的地方,像是ndarray对象和Image的区分度不高,另外有些函数选择传入路径,而有些函数选择传入文件对象也很容易让人糊涂。最后说一下,我们用上面的方式不仅可以做静态的场景切换,还可以做动态的场景切换,这样我们就可以制作更加丰富的视频。当然,效率依旧是个问题。
感谢大家阅读,喜欢就关注一下小编,感谢你们,记得转发,收藏^_^