☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░

一、引言

前几天有博友咨询,能否在视频中实现雪花飘落的效果,答案是肯定的。老猿前天简单构思了一下,利用周末时间,使用OpenCV-Python通过图像循环显示方式,实现了给图片显示增加动态雪花飘落的效果,经过不停优化,效果还是不错的,花了半天时间将实现过程总结成文,供大家参考。

二、案例背景

本次雪花来源于如下图片(文件名:f:\pic\snow.jpg):

背景可以是任意图片,下面是老猿在网上找到的一张珠峰图像(文件名:f:\pic\Qomolangma2.jpg):

珠峰背景的天空飘落着纷纷扬扬的雪花,意境不错吧?

三、实现思路

要实现雪花飘落,单张图片的单次显示肯定不够,需要不停循环显示图片,并且在每次图片显示时,生成新的雪花并更新图片中已有雪花的位置,这就需要将图片中每个雪花的位置精确管理。

自然界的雪花大小是不同的,因此为了提升逼真效果,还需要使得雪花大小在一定范围内随机变化和旋转。

不停产生大小不同的雪花,如果每次产生雪花都对雪花进行变换其实浪费了系统的资源,因此为了提升处理性能,只在程序开始初始化时一次批量生产各种不同大小、不同旋转角度的各种雪花,后续程序生成雪花时,直接从批量生成的雪花中取一个作为要生成的雪花,而不用每次从基本的雪花图像开始进行变换。

四、关键实现代码

4.1、生成各种雪花形状

def initSnowShapes():"""从文件中读入雪花图片,并进行不同尺度的缩小和不同角度的旋转从而生成不同的雪花形状,这些雪花形状保存到全局列表中snowShapesList"""global snowShapesListimgSnow = readImgFile(r'f:\pic\snow.jpg') imgSnow = cv2.resize(imgSnow, None, fx=0.2, fy=0.2) #图片文件中的雪花比较大,需要缩小才能象自然的雪花形象minFactor,maxFactor = 50,100  #雪花大小在imgSnow的0.5-1倍之间变化for factor in range(minFactor,maxFactor,5): #每次增加5%大小f = factor*0.01imgSnowSize = cv2.resize(imgSnow, None, fx=f, fy=f)for ange in range(0,360,5):#雪花0-360之间旋转imgRotate = rotationImg(imgSnowSize,ange)snowShapesList.append(imgRotate)

4.2、产生一排雪花

def generateOneRowSnows(width,count):"""产生一排雪花对象,每个雪花随机从snowShapesList取一个、横坐标位置随机、纵坐标初始为0:param width: 背景图像宽度:param count: 希望的雪花数:return:一个包含产生的多个雪花对象信息的列表,每个列表的元素代表一个雪花对象,雪花对象包含三个信息,在snowShapesList的索引号、初始x坐标、初始y坐标(才生成固定为0)"""global snowShapesListline = []picCount = len(snowShapesList) for loop in range(count):imgId = random.randint(0,picCount-1)xPos = random.randint(0,width-1)line.append((imgId,xPos,0))return line

4.3、将所有雪花对象融合到背景图像

def putSnowObjectToImg(img):"""将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动"""global snowShapesList,snowObjectshorizontalMaxDistance,verticalMaxDistance = 5,20 #水平方向左右漂移最大值和竖直方向下落最大值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 #返回融合图像

4.4、主函数

主函数读入背景图片,初始化雪花形状列表,然后循环自顶部产生一排新的雪花,并将所有雪花对象动态调整位置后融合到背景图像,每200毫秒循环一次,直至按ESC退出。

def main():global snowShapesList,snowObjectsbg = readImgFile(r'f:\pic\Qomolangma2.jpg')initSnowShapes()rows,cols = bg.shape[:2]maxObjsPerRow = int(cols/100)while(True):snowObjects += generateOneRowSnows(cols,random.randint(0,maxObjsPerRow))result = putSnowObjectToImg(bg)cv2.imshow('result',result)ch = cv2.waitKey(200)if ch==27:break

4.5、其他说明

程序的执行直接直接main函数即可,另外本程序还用到了部分老猿经常用的公用函数,这部分函数包括readImgFile、addImgToLargeImg、rotationImg,其功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》的介绍,根据介绍大家自行实现相关代码并不难。

五、主程序完整代码及雪花飘落效果

5.1、 主程序完整代码

# -*- coding: utf-8 -*-
import cv2,random
import numpy as npfrom opencvPublic import addImgToLargeImg,readImgFile,rotationImg
snowShapesList = [] #雪花形状列表
snowObjects=[]  #图片中要显示的所有雪花对象def initSnowShapes():"""从文件中读入雪花图片,并进行不同尺度的缩小和不同角度的旋转从而生成不同的雪花形状,这些雪花形状保存到全局列表中snowShapesList"""global snowShapesListimgSnow = readImgFile(r'f:\pic\snow.jpg')imgSnow = cv2.resize(imgSnow, None, fx=0.2, fy=0.2) #图片文件中的雪花比较大,需要缩小才能象自然的雪花形象minFactor,maxFactor = 50,100  #雪花大小在imgSnow的0.5-1倍之间变化for factor in range(minFactor,maxFactor,5): #每次增加5%大小f = factor*0.01imgSnowSize = cv2.resize(imgSnow, None, fx=f, fy=f)for ange in range(0,360,5):#雪花0-360之间旋转,每次旋转角度增加5°imgRotate = rotationImg(imgSnowSize,ange)snowShapesList.append(imgRotate)def generateOneRowSnows(width,count):"""产生一排雪花对象,每个雪花随机从snowShapesList取一个、横坐标位置随机、纵坐标初始为0:param width: 背景图像宽度:param count: 希望的雪花数:y:当前行对应的竖直坐标:return:一个包含产生的多个雪花对象信息的列表,每个列表的元素代表一个雪花对象,雪花对象包含三个信息,在snowShapesList的索引号、初始x坐标、初始y坐标(才生成固定为0)"""global snowShapesListline = []picCount = len(snowShapesList)for loop in range(count):imgId = random.randint(0,picCount-1)xPos = random.randint(0,width-1)line.append((imgId,xPos,0))return linedef putSnowObjectToImg(img):"""将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动"""global snowShapesList,snowObjectshorizontalMaxDistance,verticalMaxDistance = 5,20 #水平方向左右漂移最大值和竖直方向下落最大值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 #返回融合图像def main():global snowShapesList,snowObjectsinitSnowShapes()bg = readImgFile(r'f:\pic\Qomolangma2.jpg')rows,cols = bg.shape[:2]maxObjsPerRow = int(cols/100)while(True):snowObjects += generateOneRowSnows(cols,random.randint(0,maxObjsPerRow))result = putSnowObjectToImg(bg)cv2.imshow('result',result)ch = cv2.waitKey(200)if ch==27:breakmain()

5.2、雪花飘落特效

六、小结

本文介绍了通过OpenCV-Python以特定图像为背景制作雪花飘落特效的实现思路、关键函数功能以及主程序的完整代码。雪花飘落特效实际上属于图像融合的操作,只要掌握图像融合的基础知识以及设计后实现思路,实现起来还是比较快的,效果也挺不错。结合上面代码,大家还可以调整雪花的大小以及飘雪的密集程度。

有了以上内容的介绍,要实现视频加雪花特效就很容易了,只要将上述过程使用的关键步骤叠加Moviepy音视频处理合成就可以实现,老猿对本文的代码稍进行调整,然后写了个三行代码的函数就完成了相关处理,相信学习过Moviepy的都能很快实现,在此就不多介绍了,等过一阵子老猿再在Moviepy相关专栏发布相关实现。

以上实现过程需要注意:

  1. 雪花图片一般会比图片需要的效果大,怎么缩小到合适的大小需要多试一下,下面是才开始将原始图片只缩写一半之后的效果。

    可以看到该效果就不太让人满意。

  2. 控制好雪花左右移动以及下落的速度和幅度,太快、太慢以及幅度过大或过小都不太象在雪花飘落。

更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

OpenCV-Python图形图像处理:制作雪花飘落特效相关推荐

  1. OpenCV-Python 雪花飘落特效

    来源:https://blog.csdn.net/LaoYuanPython/article/details/115298737 首先看一下目标效果: 素材准备 & 思路分析 本次雪花来源于如 ...

  2. 雪花飘落代码java_JS实现的雪花飘落特效示例

    本文实例讲述了JS实现的雪花飘落特效.分享给大家供大家参考,具体如下: 首先我们要创建一个HTML文件,将其命名为index.html Canvas - 雪花特效 *{ margin:0px; pad ...

  3. php绘制雪花图,怎么制作雪花飘落动态图片 雪花效果图片制作

    雪花飘落是冬天特有的一种美景,一般来说只有生活在靠近北方的小伙伴们才有机会看到雪,而生活在南方的小伙伴就有些许遗憾啦.雪花飘落的场景当然很美,我们今天要讲的重点并不是说雪花怎么美哦,而是要教大家怎么制 ...

  4. 【打造寒冬中的浪漫雪景——OpenCV-Python 雪花飘落特效】

    [打造寒冬中的浪漫雪景--OpenCV-Python 雪花飘落特效] 寒冬到来,想要为自己的网站或者APP增添一些浪漫雪景效果吗?那就别错过这篇OpenCV-Python实现雪花飘落特效的教程!本教程 ...

  5. JS实现逼真的雪花飘落特效

    逼真的雪花飘落特效 效果图: 图片素材 : --> ParticleSmoke.png 代码如下,复制即可使用: <!doctype html> <html> <h ...

  6. HTML5的canvas雪花飘落特效

    HTML5的canvas雪花飘落特效 一.html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  7. jq制作樱花飘落特效

    jq制作樱花飘落特效 今天看到一些网站有樱花飘落,雨滴,流星,孔明灯等在整个页面飘动的特效,经过查询资料自己也做了一个,分享给大家 思路: 1.创建一个樱花的元素即为樱花图片 2.产生的樱花图片不止一 ...

  8. 前端:CSS3新特性transform制作雪花飘落动画

    transform: translateX(   px) translateY(   px); 定位元素位置(树木.雪人) 雪花飘落特效使用 @keyframes snowfly{ 0%{ backg ...

  9. 用JavaScript实现网页雪花飘落特效

    不知道大家有没有看到过别人的网页有雪花飘落的特效,我当时看到真的觉得好好看,于是乎就去借鉴别人做的特效代码,最终将这个特效成功放到自己做的网页上啦~代码放到下面啦,可以自己设置颜色,雪花形状的大小,雪 ...

最新文章

  1. win7计算机睡眠怎么设置方法,win7系统更改(设置)计算机睡眠时间的操作方法...
  2. 亿级流量系统架构演进之路
  3. 5g理论速度_5G网络相当于500M宽带是真的吗?
  4. asp.net ReportViewer 设置 rdlc textbox的值
  5. win32 htmlayout dom操作demo
  6. MiniGui移植详解1【转】
  7. vagrant up 慢的解决方案
  8. struct device结构体(2.6.23)
  9. Jmeterbadboy环境搭建
  10. python编程-Python 网络编程
  11. 利用curl去hack他人博客
  12. 科技爱好者周刊:第 98 期
  13. 【保姆级入门系列】阿ken教你学Python(六) ——组合数据类型
  14. 丽江旅游线路规划丽江游玩小贴士丽江游玩攻略花费
  15. MSP430第三十二章:Comp_B
  16. 使用Keras基于RCNN类模型的卫星/遥感地图图像语义分割
  17. ubuntu怎么看服务器固态硬盘多大
  18. 此windows不是正版
  19. 原生js的JSONP跨域请求
  20. Office与visio的快速下载与安装

热门文章

  1. 小酌重构系列[18]——重命名
  2. 目标检测中的mAP和AP计算原理
  3. 线性代数【21】特征值和特征向量的几何意义
  4. 基于人工智能的多肽药物分析的子问题——蛋白质的三级结构预测的第一周学习记录
  5. 关于bootstrap-table冻结列生成多个冻结表头和表格主体的问题
  6. Bessie Goes Moo(暴力)
  7. 【LaTex的PPT模板集】- (亲测有效)在线PPT模板及其使用方法,overleaf与TeXstudio支持中文方法
  8. 丑数(输出第n个丑数)
  9. javaScript 在表格中序号实现自增
  10. package.json文件解读