在《https://blog.csdn.net/LaoYuanPython/article/details/115298737 OpenCV-Python图形图像处理:制作雪花飘落特效》介绍了使用OpenCV制作雪花飘落特效的图像播放的过程,如果要将该功能引入到视频中,在上面博文的基础上其实是非常容易的,下面我们就来介绍实现。
要给视频加雪花特效,是基于以下原理来实现的:
本文的大部分代码来源于《https://blog.csdn.net/LaoYuanPython/article/details/115298737 OpenCV-Python图形图像处理:制作雪花飘落特效》,小部分进行了调整,增加了视频生成相关代码:
上帧图像中的雪花在当前帧中需要随机下落一定位置,并在一定幅度内横向漂移,当有雪花落到图像底部之下时,需要释放对应对象以节省资源。
addSnowEffectToImg融合雪花到图片的函数addSnowEffectToImg本文进行了优化,主要是在融合前的生成一排新雪花对象的功能合并到本函数中:
def addSnowEffectToImg(img):
"""
将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动
"""
global snowShapesList,snowObjects
horizontalMaxDistance,verticalMaxDistance = 5,10 #水平方向左右漂移最大值和竖直方向下落最大值
rows,cols = img.shape[:2]
maxObjsPerRow = int(cols/100)
snowObjects += generateOneRowSnows(cols, random.randint(0, maxObjsPerRow))
snowObjectCount = len(snowObjects)
rows,cols = img.shape[0:2]
imgResult = np.array(img)
for index in range(snowObjectCount-1,-1,-1):
imgObj = snowObjects[index] #每个元素为(imgId,x,y)
if imgObj[2]>rows: #如果雪花的起始纵坐标已经超出背景图像的高度(即到达背景图像底部),则该雪花对象需进行失效处理
del(snowObjects[index])
else:
imgSnow = snowShapesList[imgObj[0]]
x,y = imgObj[1:] #取该雪花上次的位置
x = x+random.randint(-1*horizontalMaxDistance,horizontalMaxDistance) #横坐标随机左右移动一定范围
y = y+random.randint(1,verticalMaxDistance) #纵坐标随机下落一定范围
snowObjects[index] = (imgObj[0],x,y) #更新雪花对象信息
imgResult = addImgToLargeImg(imgSnow,imgResult,(x,y),180) #将所有雪花对象图像按照其位置融合到背景图像中
return imgResult #返回融合图像
下面的代码调用addSnowEffectToImg实现对《粉丝记事本》视频的雪花飘落特效:
from moviepy.editor import *
def addVideoSnowEffect(videoFileName,resultFileName):
clip = VideoFileClip(videoFileName)
newclip = clip.fl_image(addSnowEffectToImg, apply_to=['mask'])
newclip.write_videofile(resultFileName)
if __name__ == '__main__':
addVideoSnowEffect(r'f:\video\fansNote.mp4',r'f:\video\fansNote_snow.mp4')
本文介绍了制作视频雪花飘落特效的原理、实现的思想以及流程,并利用Python+OpenCV+Moviepy提供了关键的实现代码,是一个供大家理解图像融合、Moviepy视频变换的完整案例。
更多相关moviepy知识的介绍请参考《https://blog.csdn.net/LaoYuanPython/article/details/108184832 Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》的导览式介绍。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
如果对文章内容存在疑问,可以在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。
前言 由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个...
题目链接 https://ac.nowcoder.com/acm/contest/12548/I 分析 直线用 y kx b 来...
本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新手朋友)...
期待已久的新操作系统Windows 10X的界面已经放出,干净的用户界面与Chromebook非...
1月26日消息 微软今天宣布支持 Open Web Docs,这是一个集体项目,旨在支持技术...
我们知道,缓存的设计思想在RDBMS数据库中无处不在,就拿号称2500w行代码,bug堆...
UI设计中许多概念字面看起来差别不大,但是实际上却是千差万别。许久未曾发文的...
1.女孩记住,你要嫁的不是王子,而是把你当公主的人。 2.最难开口的是,初次的...
关于这道题总的来说有两类方法迭代和递归。 先来介绍迭代递归的思路要在迭代上延...
php语言是一种脚本语言,它能够做很多事情比如说它可以用来与数据库交互开发web...