首页 / 科技 / Crossin的编程教室

Python 实现视觉特效:秒变超级赛亚人

Crossin的编程教室 2019-03-13 13:59:22 阅 读 : 2673 点 赞 : 264

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



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



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


思路


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


金色头发


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


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


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



添加头发


至于面部识别,我们还是选用前几篇反复提到的dlib???/strong>。


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


拿到拍摄的图片后,涉及到人脸识别。Python可以直接调用dlib库进行面部模式识别,其中也包含了准度较高的眼部识别:



通过37、38、40、41来确定左眼球位置,43、44、48、47来确定右眼球位置。


于是我们就可以将头发添加到dlib的面部模式中:

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

#dlib面部识别??橄喙?/span>
import dlib
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

#获取面部模式
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)

做完头发效果如图:


电弧特效


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


针对不同的位置,我将电弧分为三组(其实是通过同一组旋转变换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)

最终效果截图:

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


原作者表示一个超级赛亚人太孤单,我来陪他一起变

现在流行的短视频App中的特效,比如加眼镜加口罩加狗头……你都可以用类似方法通过 Python 来实现。


代码下载


公众号(Crossin的编程教室)后台回复关键字?赛亚人?获取代码和相关素材图片下载,代码已添加详细注释。




本文是我们编程教室新春征稿活动的一篇投稿,来自 @TED?同学,如果你经常上我们的论坛,一定见过这个ID的身影,他经常在上面回答其他同学的问题。他自己也开了一个python学习的公众号:TEDxPY,欢迎各位去找他交流学习。

我们编程教室会持续向所有人开放,如果有投稿或参与志愿者的意向,欢迎随时在公众号里给我们留言。





其他内容回复左侧关键词获?。?/span>

python?:零基础入门课程目录

新手?:初学者指南及常见问题

资源?:超过500M学习资料网盘地址

项目?:十多个进阶项目代码实例


如需了解视频课程及答疑群等更多服务,请号内回复?码上行动

代码相关问题可以在论坛上发帖提问?bbs.crossincode.com


推荐阅读:

Python转行?|?爬抖音?|?如何debug?|?查天气?|?我用Python?|?知乎?|?单词表?|?新手建议?|?如何提问?|?一图学Python?|?智能防挡弹幕?|?红包提醒?|?流浪地球



欢迎加入

Crossin的编程教室

crossincode.com


请把我们分享给身边爱学习的小伙伴 :)??

?点击文末“阅读原文”,查看更多学习资源

幸运飞艇开奖官方

免责声明: 本站资料及图片来源互联网文章-|,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关-|,如用户分享不慎侵犯了您的权益,请联系我们告知,-|我们将做删除处理!