用Python实现5毛钱特效

一、前言

请务必看到最后。Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛。前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视频换一个不同的场景,于是就有了今天的文章。

我们先看看能实现什么效果,先来个正常版的,先看看原场景:

用Python实现5毛钱特效

下面是我们切换场景后的样子:

用Python实现5毛钱特效

看起来效果还是不错的,有了这个我们就可以随意切换场景,坟头蹦迪不是梦。另外,我们再来看看另外一种效果,相比之下要狂放许多:

用Python实现5毛钱特效

二、实现步骤

我们都知道,视频是有一帧一帧的画面组成的,每一帧都是一张图片,我们要实现对视频的修改就需要对视屏中每一帧画面进行修改。所以在最开始,我们需要获取视频每一帧画面。

在我们获取帧之后,需要抠取画面中的人物。

抠取人物之后,就需要读取我们的场景图片了,在上面的例子中背景都是静态的,所以我们只需要读取一次场景。在读取场景之后我们切换每一帧画面的场景,并写入新的视频。

这时候我们只是生成了一个视频,我们还需要添加音频。而音频就是我们的原视频中的音频,我们读取音频,并给新视频设置音频就好了。

具体步骤如下:

读取视频,获取每一帧画面

批量抠图

读取场景图片

对每一帧画面进行场景切换

写入视频

读取原视频的音频

给新视频设置音频

因为上面的步骤还是比较耗时的,所以我在视频完成后通过邮箱发送通知,告诉我视频制作完成。

三、模块安装

我们需要使用到的模块主要有如下几个:


用Python实现5毛钱特效

我们都可以直接用pip安装:

用Python实现5毛钱特效

其中OpenCV有一些适配问题,建议选取3.0以上版本。

四、具体实现

我们导入如下包:

用Python实现5毛钱特效

其中Pillow和opencv导入的名称不太一样,还有就是我自定义的mail模块。另外我们还要先准备一些路径:

用Python实现5毛钱特效

接下来我们按照上面说的步骤一个一个实现。

(1)读取视频,获取每一帧画面

在OpenCV中提供了读取帧的函数,我们只需要使用VideoCapture类读取视频,然后调用read函数读取帧,read方法返回两个参数,ret为是否有下一帧,frame为当前帧的ndarray对象。完整代码如下:

用Python实现5毛钱特效

在标处,我获取了帧的总数,然后通过如下公式获取比帧数大的整十整百的数:

用Python实现5毛钱特效

这样做是为了让画面逐帧排序,这样读取的时候就不会乱。另外我们获取了视频的帧率和分辨率,这两个参数在我们创建视频时需要用到。这里需要注意的是opencv3.0以下版本获取帧率和画面大小的写法有些许差别。

(2)批量抠图

批量抠图需要用到paddlehub中的模型库,代码很简单,这里就不多说了:

用Python实现5毛钱特效

我们执行上面函数后会在项目下生成一个humanseg_output目录,抠好的图片就在里面。

(3)读取场景图片

这也是简单的图片读取,我们使用pillow中的Image对象:

用Python实现5毛钱特效

这里的返回的对象并非ndarray对象,而是Pillow中定义的类对象。

(4)对每一帧画面进行场景切换

简单来说就是将抠好的图片和背景图片合并,我们知道抠好的图片都在humanseg_output目录,这也就是为什么最开始要准备相应的变量存储该目录的原因:

用Python实现5毛钱特效

在标处,我们复制了背景,如果少了这一步的话,生成的就是我们上面的“千手观音效果”了。

其它步骤都很好理解,只有返回值比较长,我们来详细看一下:

用Python实现5毛钱特效

最后bgr_im_array就是我们最终的返回结果。

(5)写入视频

为了节约空间,我并非等将写入图片放在合并场景后面,而是边合并场景边写入视频:

用Python实现5毛钱特效

上面的代码也非常简单,执行完成后项目下会生成一个green.mp4,这是一个没有音频的视频,后面就需要我们获取音频然后混流了。

(6)读取原视频的音频

因为在opencv中没找到音频相关的处理,所以选用moviepy,使用起来也非常方便:

用Python实现5毛钱特效

然后就是混流了。

(7)给新视频设置音频

这里同样使用moviepy,传入视频名称和音频对象进行混流:

用Python实现5毛钱特效

其中output_video是我们在最开始定义的变量。

(8)删除过渡文件

在我们生产视频时,会产生许多过渡文件,在视频合成后我们将它们删除:

用Python实现5毛钱特效

最后就是将整个流程整合一下。

(8)整合

我们将上面完整的流程合并成一个函数:

用Python实现5毛钱特效

(9)在main中调用

我们可以把前面定义的路径也放进了:

用Python实现5毛钱特效

这样我们就完成了完整的流程。

五、发送邮件

邮件的发送又是属于另外的内容了,我定义了一个mail.py文件,具体代码如下:


用Python实现5毛钱特效

六、总结

老实说上述程序的效率非常低,不仅占空间,而且耗时也比较长。在最开始我切换场景选择的是遍历图片每一个像素,而后找到了更加高效的方式取代了。但是帧画面的保存,和png图片的存储都很耗费空间。


七、喜欢可以帮小明转发此文章哦 转发后可以私信小明同学:惊喜

,有给你们准备了一点小小的惊喜哦


分享到:


相關文章: