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

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

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

光理论是不够的,在此送大家一套2020Pyhon学习手册(第4版)、Python开发技术详解链接、PYTHON网络爬虫从入门到实践、Python爬虫开发与项目实战, 私信小编“学习”来免费获取吧,希望大家一起进步哦!
二、实现步骤
我们都知道,视频是有一帧一帧的画面组成的,每一帧都是一张图片,我们要实现对视频的修改就需要对视屏中每一帧画面进行修改。所以在最开始,我们需要获取视频每一帧画面。
在我们获取帧之后,需要抠取画面中的人物。
抠取人物之后,就需要读取我们的场景图片了,在上面的例子中背景都是静态的,所以我们只需要读取一次场景。在读取场景之后我们切换每一帧画面的场景,并写入新的视频。
这时候我们只是生成了一个视频,我们还需要添加音频。而音频就是我们的原视频中的音频,我们读取音频,并给新视频设置音频就好了。
具体步骤如下:
读取视频,获取每一帧画面
批量抠图
读取场景图片
对每一帧画面进行场景切换
写入视频
读取原视频的音频
给新视频设置音频
因为上面的步骤还是比较耗时的,所以我在视频完成后通过邮箱发送通知,告诉我视频制作完成。
三、模块安装
我们需要使用到的模块主要有如下几个:

我们都可以直接用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爬虫开发与项目实战, 私信小编“学习”来免费获取吧,希望大家一起进步哦!
六、总结
老实说上述程序的效率非常低,不仅占空间,而且耗时也比较长。在最开始我切换场景选择的是遍历图片每一个像素,而后找到了更加高效的方式取代了。但是帧画面的保存,和png图片的存储都很耗费空间。
另外程序设计还是有许多不合理的地方,像是ndarray对象和Image的区分度不高,另外有些函数选择传入路径,而有些函数选择传入文件对象也很容易让人糊涂。最后说一下,我们用上面的方式不仅可以做静态的场景切换,还可以做动态的场景切换,这样我们就可以制作更加丰富的视频。当然,效率依旧是个问题。
感谢大家阅读,喜欢就关注一下小编,感谢你们,记得转发,收藏^_^

python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)相关推荐

  1. python豆瓣影评_教你用python登陆豆瓣并爬取影评

    教你用python登陆豆瓣并爬取影评 一起来 日常学python 这是我的第二篇原创文章 在上篇文章爬取豆瓣电影top250后,想想既然爬了电影,干脆就连影评也爬了,这样可以看看人们评价的电影,再加上 ...

  2. 用python做头像_教你用python下载和拼接微信好友头像图片

    相信微信大家是用得再多也不过了.那么,对于python+微信,又能玩出什么新的花样呢?下面就给大家带来一个好玩的东西.用python下载所有的微信好友的头像,然后拼接成一张大图.这样,大家就可以转载到 ...

  3. python url拼接_教你写python爬虫——用python爬原图

    环境:python3.6 + pycharm "猎物":http://www.polayoutu.com (仅学习用) 动机1:想要爬一些尺寸比较大(不是尺度)的美图养养眼,仅此而 ...

  4. 微信python天天学_教你使用python实现微信每天给女朋友说晚安

    本文为大家分享了教你用微信每天给女朋友说晚安的python实战,供大家参考,具体内容如下 但凡一件事,稍微有些重复.我就考虑怎么样用程序来实现它. 这里给各位程序员朋友分享如何每天给朋友定时微信发送& ...

  5. python文本分类_教你用python做文本分类

    什么是文本分类 一个文本分类问题就是将一篇文档归入预先定义的几个类别中的一个或几个.通俗点说,就是拿一篇文章,问计算机这文章要说的究竟是体育,经济还是教育.文本分类是一个监督学习的过程,常见的应用就是 ...

  6. python浪漫微信_教你用python做一个哄女友的微信自动回复机器人

    虽然题目是这样的,但是为了两人的幸福,还是尽量不要这么敷衍你的女朋友,毕竟这个世上还是有很多单身狗存在的 . 这是一个github最近刚刚上传的一个开源项目,短短几天就已经有了3000+star,原本 ...

  7. python画恐龙_教你用Python实现谷歌的小恐龙游戏

    谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏". (如果想要直接进行游戏,可以在地址栏输入:chrome://dino ) 今天我们就来给大家演示下, ...

  8. python广告搞笑_教你用 Python 写一个搞笑版的“笨鸟”游戏:牛逼的黄瓜

    我想你应该玩过这个鸟游戏: 想当年,小编和身边的朋友在玩这个游戏的时候玩到手到快废了... 今天心血来潮,要不咱们自己用 Python 撸一个这样的游戏吧,想想还是挺好玩的. 首先我们分析一下这个鸟游 ...

  9. python搞笑语句_教你用 Python 写一个搞笑版的“笨鸟”游戏:牛逼的黄瓜

    我想你应该玩过这个鸟游戏: 想当年,小编和身边的朋友在玩这个游戏的时候玩到手到快废了... 今天心血来潮,要不咱们自己用 Python 撸一个这样的游戏吧,想想还是挺好玩的. 首先我们分析一下这个鸟游 ...

最新文章

  1. 「镁客·请讲」天宝陈朝晖:AI 的准确译法不是人工智能,而是机器智能...
  2. Jenkins插件之环境变量插件EnvInject
  3. FOR ALL ENTRIES IN内表排序、排重对性能的影响
  4. java上移动,Java在屏幕上移动对象
  5. spring boot添加swagger步骤
  6. linux find 权限不够,超级用户find: `/home/pipi/.gvfs': 权限不够
  7. 通用网页调用本地应用程序方案(windows平台)
  8. 奇特的Local System权限(转载)
  9. 6.2创建Docker镜像文件
  10. 深度学习系列讲座:谷歌翻译核心技术 Seq2Seq
  11. WPS Mac旧版该怎么彻底卸载干净
  12. linux微软雅黑字体库_Linux_Debian系统中安装微软雅黑字体的教程,想在linux下添加微软雅黑的字 - phpStudy...
  13. Juniper-SRX-基于域控认证的用户防火墙
  14. [转]铁路客车列车座位分布
  15. python指纹识别_Python实现指纹识别你见过没?
  16. C#窗体Winform,如何嵌入图片添加图片,使用图片资源?
  17. 祝大家新年快乐,前兔似锦!
  18. 谷歌高效开发的秘密:来自谷歌前员工的软件开发工具指南
  19. 美颜SDK有什么用?美颜SDK可以在直播和短视频中有哪些作用?
  20. vue配置favicon.ico图标

热门文章

  1. java 无法继承抽象类_java抽象类可以被继承吗?
  2. 系统启动数据库服务器,linux系统如何启动数据库服务器
  3. swift php 类型判断,iOS开发 - Swift实现检测网络连接状态及网络类型
  4. workbeach约束简称_AnsysWorkbenchFluidFlow(FLUENT)经典问题.docx
  5. 嵌入式和单片机,是同一个东西吗?
  6. 硬件工程师前途到底怎样?看看大佬怎么说,看完跪了
  7. java 控制 crt_secureCRT关闭连接自动关闭tomcat服务
  8. 计算机专业哪家强,计算机专业哪家强?这4所大学水平一流,网友:都是“大佬”级别...
  9. vue项目开发实战案例_Vue、Spring Boot开发小而完整的Web前后端分离项目实战02
  10. 牛客假日团队赛5 K 金币馅饼 (DP 基础题)