在《https://blog.csdn.net/LaoYuanPython/article/details/115298737 OpenCV-Python图形图像处理:制作雪花飘落特效》介绍了使用OpenCV制作雪花飘落特效的图像播放的过程,如果要将该功能引入到视频中,在上面博文的基础上其实是非常容易的,下面我们就来介绍实现。
要给视频加雪花特效,是基于以下原理来实现的:
本文的大部分代码来源于《https://blog.csdn.net/LaoYuanPython/article/details/115298737 OpenCV-Python图形图像处理:制作雪花飘落特效》,小部分进行了调整,增加了视频生成相关代码:
上帧图像中的雪花在当前帧中需要随机下落一定位置,并在一定幅度内横向漂移,当有雪花落到图像底部之下时,需要释放对应对象以节省资源。
融合雪花到图片的函数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 微信公号发消息咨询。