github python 画图_Python:变身超级赛亚人

5c723eec12ed9b8509ac8bfcc3394702.png

上周六搞了个修炼写轮眼,利用python代码定位眼球再贴图,有点太粗糙。今儿又周末,效果升级下,玩个变身超级赛亚人——

预期是动态显示变身后的金色头发、光芒和周围附带的电弧,以下是最终效果:

d21ac8f51de2c6548577acab0a25d170.png
Python变身超级赛亚人_腾讯视频​v.qq.com
220b51cb7fc4b5a2fd0b911466771767.png

视频中可以看到,金色头发可以根据面部大小进行自动调整,“光芒”在头发外围弱弱展现,电弧也算是动态变换,勉强达成目标

思路

在Python代码中通过opencv启用摄像头拍摄,对获取到的图像通过dlib模块进行面部识别,之后利用PIL模块进行图像处理,添加金色赛亚人头发。因为摄像头一直处于获取图像的while循环中,通过对不同图片中添加不同形态的电弧图像,形成最终视频中动态电弧效果。

金色头发

说到这个头发,对某度我真是无语,最终不得不英文搜到了目标:

fcfeba90094473c6e0a9013b71449eec.png

OK,搞定,我选择的是第五个图片,下载后是白底jpg格式,先利用Photoshop将其改为背景透明的png格式:

3063d18366d37333c4ca2dbbd1e6e881.png

为了加发光特效,我是选用的Win10自带的画图3D软件,其中的喷雾罐效果,在头发外围加了一圈黄色喷雾:

d80ed8d9ce793051d3f75f82a9fed006.png

添加头发

至于面部识别,我们还是选用前几篇反复提到的dlib模块。

dlib是一个包含机器学习算法的开源工具包。目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。

我们先将头发缩放添加到dlib的面部模式中:

acc48461c797070238d2ac96d7af18e6.png

调整位置,并根据面部识别到的脸部尺寸对头发图片大小进行调整,计算头发在摄像头图像中的添加位置。

#获取面部模式
landmarks = predictor(gray, face)
#定位面部左上角点坐标
x1,y1 = landmarks.part(0).x, landmarks.part(0).y
# 定位面部右上角点坐标
x2, y2 = landmarks.part(16).x, landmarks.part(16).y
#计算面部宽度
d = math.sqrt((x2-x1)**2+(y2-y1)**2)
#根据面部宽度计算金色头发尺寸
size = int(d / 236 * 439)
#对头发图片缩放
resized = adding.resize((size,size))
#在合适位置添加头发图片
im.paste(resized,(int(x1-d*86/236),int(y1-d*394/236)),resized)

做完头发效果如图:

eb685d9f78c4b9dc11d38c7c8213ca46.png

电弧特效

因为这是通过摄像头一直在抓取图像,那么只要这一刻和下一刻处理后的电弧图像不一致,就会产生动态电弧的效果。所以实现方式就是准备些背景透明的电弧图片,在代码中随机选取进行缩放后添加到图像中。

aec80ca4d62e5fb1f39afe2d300302d8.png

针对不同的位置,我将电弧分为三组(其实是通过同一组旋转变换Ps成三组的),l1-l4是放在左侧的,r1-r4是右侧,t1-t4是顶部位置的。对抓取到的头像,随机添加电弧图片:

#电弧图片定义
lightlist = ["l1.png","l2.png","l3.png","l4.png"]
rightlist = ["r1.png","r2.png","r3.png","r4.png"]
toplist = ["t1.png","t2.png","t3.png","t4.png"]

#电弧尺寸
lightsize = int(d/2)
#随机获取电弧图片
ligntning = Image.open(lightlist[random.randint(0, 3)])
#对电弧进行缩放
relight = ligntning.resize((lightsize, lightsize))
#找到合适位置添加电弧图片
im.paste(relight,(int(x1-d*60/236),int(y1-d*380/236)),relight)

最终效果截图:

fcd1e62c833d2bfc8f00a62c3db09148.png

下一时刻:

20652eec730c03a017af7abf4c7b9dd1.png

可以对比,电弧实现了不同形态的变换展示~

代码下载

超级赛亚人代码及素材

网盘下载链接:https://pan.baidu.com/s/1wV6SbnYEwpRaw6rkoWLA0Q 提取码:4zzp

Github代码下载链接: https://github.com/pengfexue2/supersaiyan.git 若通过GitHub下载代码,需要通过README.md中的链接下载面部识别要用到的dat文件

代码已添加详细注释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值