美文网首页大数据 爬虫Python AI Sql
教你用Python实现5毛钱特效(给你的视频来点料)

教你用Python实现5毛钱特效(给你的视频来点料)

作者: IT领域君 | 来源:发表于2020-04-28 15:33 被阅读0次

    一、前言

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

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

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

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

    光理论是不够的,在此送大家一套2020Pyhon学习手册(第4版)、Python开发技术详解链接、PYTHON网络爬虫从入门到实践、Python爬虫开发与项目实战, 需要的小伙伴添加助理w❤:bjmsb07 或者 衣五九三一零巴六三八六(数字谐音)来免费获取吧,希望大家一起进步哦!

    二、实现步骤

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

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

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

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

    具体步骤如下:

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

    批量抠图

    读取场景图片

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

    写入视频

    读取原视频的音频

    给新视频设置音频

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

    三、模块安装

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

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

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

    在我们使用paddlehub之前,我们需要安装paddlepaddle:具体安装步骤可以参见官网。用paddlehub抠图参考:别再自己抠图了,Python用5行代码实现批量抠图。我们这里直接用pip安装cpu版本的:

    有了这些准备工作就可以开始我们功能的实现了。

    四、具体实现

    我们导入如下包:

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

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

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

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

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

    1|frame_name = math.pow(10, len(frame_num))

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

    (2)批量抠图

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

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

    (3)读取场景图片

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

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

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

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

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

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

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

    (5)写入视频

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

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

    (6)读取原视频的音频

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

    然后就是混流了。

    (7)给新视频设置音频

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

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

    (8)删除过渡文件

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

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

    (9)整合

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

    (10)在main中调用

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

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

    五、发送邮件

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

    里面的邮箱我是直接写死了,大家可以自由发挥。为了方便,推荐发件人使用163邮箱,收件人使用QQ邮箱。另外在登录的时候直接使用密码比较方便,但是有安全隐患。

    最后送大家一套2020最新Pyhon学习手册(第4版)、Python开发技术详解链接、PYTHON网络爬虫从入门到实践、Python爬虫开发与项目实战, 需要的小伙伴添加助理w❤:bjmsb07 或者 衣五九三一零巴六三八六(数字谐音)来免费获取吧,希望大家一起进步哦! 

    六、总结

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

    另外程序设计还是有许多不合理的地方,像是ndarray对象和Image的区分度不高,另外有些函数选择传入路径,而有些函数选择传入文件对象也很容易让人糊涂。最后说一下,我们用上面的方式不仅可以做静态的场景切换,还可以做动态的场景切换,这样我们就可以制作更加丰富的视频。当然,效率依旧是个问题。

    感谢大家阅读,喜欢就关注一下小编,感谢你们,记得转发,收藏^_^

    相关文章

      网友评论

        本文标题:教你用Python实现5毛钱特效(给你的视频来点料)

        本文链接:https://www.haomeiwen.com/subject/zmavwhtx.html