0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用OpenCV-Python图形图像处理制作出雪花飘落特效详解

新机器视觉 来源:CSDN技术社区 作者:LaoYuanPython 2021-04-14 14:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

效果展示

首先看一下目标效果:

素材准备 & 思路分析

本次雪花来源于如下图片

背景可以是任意图片,下面是老猿在网上找到的一张珠峰图像

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

实现思路

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

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

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

关键实现代码

1、生成各种雪花形状

def initSnowShapes(): “”“ 从文件中读入雪花图片,并进行不同尺度的缩小和不同角度的旋转从而生成不同的雪花形状,这些雪花形状保存到全局列表中snowShapesList ”“” global snowShapesList imgSnow = readImgFile(r‘f:picsnow.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.01 imgSnowSize = cv2.resize(imgSnow, None, fx=f, fy=f) for ange in range(0,360,5):#雪花0-360之间旋转 imgRotate = rotationImg(imgSnowSize,ange) snowShapesList.append(imgRotate)

2、产生一排雪花

def generateOneRowSnows(width,count): “”“ 产生一排雪花对象,每个雪花随机从snowShapesList取一个、横坐标位置随机、纵坐标初始为0 :param width: 背景图像宽度 :param count: 希望的雪花数 一个包含产生的多个雪花对象信息的列表,每个列表的元素代表一个雪花对象,雪花对象包含三个信息,在snowShapesList的索引号、初始x坐标、初始y坐标(才生成固定为0) ”“” global snowShapesList line = [] 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

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

def putSnowObjectToImg(img): “”“ 将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动 ”“” global snowShapesList,snowObjects horizontalMaxDistance,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、主函数

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

def main(): global snowShapesList,snowObjects bg = readImgFile(r‘f:picQomolangma2.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

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

5.1、 主程序完整代码

# -*- coding: utf-8 -*-import cv2,randomimport numpy as np

from opencvPublic import addImgToLargeImg,readImgFile,rotationImgsnowShapesList = [] #雪花形状列表snowObjects=[] #图片中要显示的所有雪花对象

def initSnowShapes(): “”“ 从文件中读入雪花图片,并进行不同尺度的缩小和不同角度的旋转从而生成不同的雪花形状,这些雪花形状保存到全局列表中snowShapesList ”“” global snowShapesList imgSnow = readImgFile(r‘f:picsnow.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.01 imgSnowSize = 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: 希望的雪花数 当前行对应的竖直坐标 一个包含产生的多个雪花对象信息的列表,每个列表的元素代表一个雪花对象,雪花对象包含三个信息,在snowShapesList的索引号、初始x坐标、初始y坐标(才生成固定为0) ”“” global snowShapesList line = [] 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

def putSnowObjectToImg(img): “”“ 将所有snowObjects中的雪花对象融合放到图像img中,融合时y坐标随机下移一定高度,x坐标左右随机小范围内移动 ”“” global snowShapesList,snowObjects horizontalMaxDistance,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,snowObjects

initSnowShapes() bg = readImgFile(r‘f:picQomolangma2.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:break

main()

总结

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

以上实现过程需要注意:

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenCV
    +关注

    关注

    33

    文章

    651

    浏览量

    44418
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89582

原文标题:OpenCV-Python图形图像处理:制作雪花飘落特效

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    那些年我用OpenCV+Qt趟过哪些坑?写给视觉应用开发者的避坑指南

    前阵子,团队里新来的小伙子跑来找我,眉头紧锁。他手里的项目我清楚:一个基于摄像头的简单计数工具。Demo阶段用Python+OpenCV,几行代码跑得飞快,准确率也好看。可一旦要打包成给产线工人用
    发表于 12-02 09:43

    【创龙TL3562-MiniEVM开发板试用体验】问题4 ubuntu镜像,opencv不能正常工作??

    /simple --trusted-host mirrors.aliyun.com opencv-python 示例代码 import cv2 # 初始化摄像头对象,0通常是默认的摄像头索引 #cap
    发表于 08-11 22:17

    【GM-3568JHF开发板免费体验】OpenCV开发环境安装和计数程序开发

    查看ip SSH链接 远程登录账号和密码是linaro 二、安装Pip管理工具 Sudo apt-get install python3-pip 三、安装cv2环境 cv2支持图像处理(如滤波、边缘
    发表于 08-09 13:30

    如何板端编译OpenCV并搭建应用--基于瑞芯微米尔RK3576开发板

    INSTALL_PYTHON_EXAMPLES=OFF -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=/home/myir/Downloads
    发表于 08-08 17:14

    飞腾主板上的芯片组X100能起到什么作用?

    飞腾主板上的芯片组X100作为飞腾处理器的重要配套芯片,在计算机系统中承担着多元且关键的作用,主要体现在图形图像处理与接口扩展两大核心功能领域。
    的头像 发表于 07-28 09:25 471次阅读

    【Milk-V Duo S 开发板免费体验】SDK编译、人脸检测、OpenCV测试

    -mobile-test ./opencv-mobile-test 生成 200x200 尺寸的 out.jpg 图像,即实现图片压缩。 该测试工程可结合物体识别模型,实现输入图像的尺寸调整,为之后的推理和
    发表于 07-11 13:48

    【正点原子STM32MP257开发板试用】2.USB摄像头使用

    ) (usb-482f0000.usb-1.3): /dev/video7 /dev/video8 /dev/media2 最后一个(UVC Camera)就是设备,要记下是video多少,后期opencv-python需要
    发表于 06-16 19:16

    itop-3568开发板机器视觉opencv开发手册-图像绘制-画线

    用 imshow()函数对画线之后的图像进行展示; 第 8 行使用了 waitKey()函数,持续显示展示照片直到按键的按下。 保存退出之后,在终端界面中输入以下命令进行 python 代码的运行,运行结果
    发表于 06-04 10:38

    商汤科技推动扩展现实及虚拟数字人标准化进程

    近日,全国信息技术标准化技术委员会计算机图形图像处理及环境数据表示分技术委员会在杭州举办“移动设备增强现实国家标准宣贯会暨扩展现实(XR)及虚拟数字人工作组2025年第一次工作组全体会议”。
    的头像 发表于 04-19 11:36 825次阅读

    何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板

    摄像头)1、安装python3-opencvaptinstallpython3-opencv(左右移动查看全部内容)2、查看摄像头支持的格式与分辨率root@debi
    的头像 发表于 04-15 11:51 640次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>OpenCV</b>的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板

    快速部署!米尔全志T527开发板的OpenCV行人检测方案指南

    sudo apt-get install libopencv-dev python3-opencv 2.在全志T527开发板​安装pipsudo apt-get install python3-pip 二
    发表于 04-11 18:14

    英特尔揭秘影视制作软件的法术秘籍

    近日,影视动画产业的热情又添了一把火,悉数近年来的动画电影,画面和特效等都让观众为之折服。这么多绚丽的影片特效和画面,究竟能够用什么软件工具制作出来呢?影视制作中最耗时的渲染又有什么办
    的头像 发表于 03-03 11:05 905次阅读

    使用Python+OpenCV处理图片

    如果给你一张图片作为背景,另外一张图片中的物体作为前景图,要把前景图中的物体叠加布置到背景图的中间位置,并且前景图中的物体需要在背景图中有旋转和投影,怎么处理?
    的头像 发表于 12-23 15:54 1201次阅读

    AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV

    1 简介 Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机
    发表于 12-14 09:31

    【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

    适用于哪些场景,然后通过Python编写代码来实现这些算法,并应用于实际项目中,实现图像的检测、识别、分类、定位、测量等目标。华清远见【python+OpenCV
    的头像 发表于 12-09 16:42 1894次阅读
    【AI实战项目】基于<b class='flag-5'>OpenCV</b>的“颜色识别项目”完整操作过程