dlib实现红眼特效
效果
(图片来源网络,如有侵权请联系删除)
摘要
技术栈如下:
代码演示:python
面部关键点识别:dlib
图像处理:pillow,opencv
人脸关键点
既然是做人眼部位的贴图,需要知道人眼与水平方向的夹角,关键点就是左眼的36点和39点,右眼的42点和45点。
还需要准备红眼贴纸,用于后续覆盖在眼部。
代码
import cv2 as cv
import dlib
from PIL import Imagedef detect_predict():# 生成predictor和detectordetector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')return detector, predictordef cal_ang(point_1, point_2, point_3):# 三点计算夹角,返回角度对应各点的角度a = math.sqrt((point_2[0]-point_3[0])*(point_2[0]-point_3[0])+(point_2[1]-point_3[1])*(point_2[1] - point_3[1]))b = math.sqrt((point_1[0]-point_3[0])*(point_1[0]-point_3[0])+(point_1[1]-point_3[1])*(point_1[1] - point_3[1]))c = math.sqrt((point_1[0]-point_2[0])*(point_1[0]-point_2[0])+(point_1[1]-point_2[1])*(point_1[1]-point_2[1]))A = math.degrees(math.acos((a*a-b*b-c*c)/(-2*b*c)))B = math.degrees(math.acos((b*b-a*a-c*c)/(-2*a*c)))C = math.degrees(math.acos((c*c-a*a-b*b)/(-2*a*b)))return math.ceil(A), math.ceil(B), math.ceil(C)origin = cv.imread('人脸图片')
gray = cv.cvtColor(origin, cv.COLOR_BGR2GRAY)detector, predictor = detect_predict()
res = detector(gray, 1)faces = []
for face in res:shape = predictor(origin, face)parts = shape.parts()faces.append(parts)scale = 5.2 # mask宽度 = 眼距 * scale
pil_img = Image.fromarray(cv.cvtColor(origin, cv.COLOR_BGR2RGB))
mask = Image.open('红眼贴纸')
mask = mask.convert('RGBA')
mw, mh = mask.sizemeasure_l = 0.55 # 左眼mask的中心点位置
measure_r = 0.48 # 右眼mask的中心点位置
eyes = []# 左眼
angle = cal_ang((p[36].x, p[36].y), (p[36].x + 10, p[36].y), (p[39].x, p[39].y))
ang = int('-' + str(angle[0])) if p[36].y < p[39].y else angle[0]
canthus = math.sqrt(math.pow(p[36].x - p[39].x, 2) + math.pow(p[36].y - p[39].y, 2))
target_h = int(mh / (mw / (canthus * scale)))
m1 = mask.resize((int(canthus * scale), target_h), Image.ANTIALIAS)
m1 = m1.rotate(ang, expand=True)
w, h = m1.size
x, y = ((p[38].x + p[40].x) / 2, (p[38].y + p[40].y) / 2)# 小于0时,会出现1px的偏差
ltx = int(x - measure_l * w) if int(x - measure_l * w) >= 0 else int(x - measure_l * w) - 1
lty = int(y - h/2 + ang / 180 * canthus) if int(y - h/2 + ang / 180 * canthus) >= 0 else int(y - h/2 + ang / 180 * canthus) - 1
position = (ltx, lty, int(x - w * measure_l + w), int(y - h/2 + h + ang / 180 * canthus))
pil_img.paste(m1, position, mask=m1.split()[-1])# 右眼
angle = cal_ang((p[42].x, p[42].y), (p[42].x + 10, p[42].y), (p[45].x, p[45].y))
ang = int('-' + str(angle[0])) if p[42].y < p[45].y else angle[0]
canthus = math.sqrt(math.pow(p[42].x - p[45].x, 2) + math.pow(p[42].y - p[45].y, 2))
target_h = int(mh / (mw / (canthus * scale)))
m2 = mask.resize((int(canthus * scale), target_h), Image.ANTIALIAS)
m2 = m2.rotate(ang, expand=True)
w, h = m2.size
x, y = ((p[43].x + p[47].x) / 2, (p[43].y + p[47].y) / 2)# 小于0时,出现1px的偏差
ltx = int(x - measure_r * w) if int(x - measure_r * w) >= 0 else int(x - measure_r * w) - 1
lty = int(y - h / 2 - ang / 180 * canthus) if int(y - h / 2 - ang / 180 * canthus) >= 0 else int(y - h / 2 - ang / 180 * canthus) - 1
position = (ltx, lty, int(x - w * measure_r + w), int(y - h / 2 + h - ang / 180 * canthus))
pil_img.paste(m2, position, mask=m2.split()[-1])
68点人脸关键点检测模型:
链接:https://pan.baidu.com/s/1_kBo6zoYacZdeqgISbkUew
提取码:2sok
问题
所有这种直接在平面贴图的方式,都会面临透视的问题。当用户面部倾斜,并且人的眼部本身就不是在一个平面上,这种情况下的处理结果则很不理想。无法通过正面遮挡,弥补这种处理的缺点。
**更多功能,或者想体验一下,可以扫下方二维码:**
主业前端程序猿一枚。图片处理方面,作为业余爱好。如有错误,请各位大佬轻喷,谢谢!!
dlib实现红眼特效相关推荐
- autojs红眼特效
牙叔教程 简单易学 效果展示 autojs版本 8.8.2-0 代码简介 识别眼睛, 使用的是百度的人脸检测 在眼睛的位置, 画红眼特效, 使用了阴影, 模糊 红眼特效区域使用path.quadTo画 ...
- C++坑人游戏[1.0版本](完)
本次如期增加: 1.Penta Kill 和 Shut Down 2.红眼特效的音乐 本次额外增加(VS版): 反Alt+F4机制 但是,我这才发现Dev-C++好像不支持多线程--所以如果是用Dev ...
- 沉睡者IT - 4种在家就能带货赚钱的直播课-视频教程目录
抖音引流培训课程视频教程讲座简介: <4种在家就能带货赚钱的直播课>人人都能直播,适合在家一个人操作! 课程内容目录: 一.直播课 01.直播赛道解析.mp4 02.测试效果型-制作产品型 ...
- 绝绝子还是YYDS,2021国民年度流行语出炉
2021年临近尾声,搜狗输入法保持传统,通过征集整理网友投稿发布#2021国民年度流行语#TOP100超级榜. 根据搜狗输入法官方微博显示,今年各大网络文学粉墨登场,缩写梗层出不穷,新闻热评和娱乐事件 ...
- 【Linux】Ubuntu 可以不用安装 yum
欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行.动静不失其时,其道光明. 目录 1.缘起 2.yum 命令和 apt 命令 3.总结 1.缘起 最近在 Bi ...
- python实现面部特效_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示
1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...
- 创意赛第二季又来了,PaddleHub人脸关键点检测实现猫脸人嘴特效
前段时间,下班后闲来无事,参加了百度PaddleHub的AI人像抠图创意赛,凭借着大家的阅读量,获得了一个第三名,得了一个小度音响,真香啊! 对,说的是我 小奖品 PaddleHub创意赛第二期又出来 ...
- 超火AI变脸特效来袭!马云蔡徐坤一起《吗咿呀嘿》 网友:摇不能停
来源/雷锋网 ID/leiphone-sz 记者/贝爽 蚂蚁呀嘿,蚂蚁牙呼,蚂蚁牙呼呼呼~ 相信不少朋友一大早就被这首"蚂蚁呀嘿"洗脑了,这个BGM原本出自新加坡歌手郭美美的< ...
- C# vb .net实现消除红眼效果
在.net中,如何简单快捷地实现Photoshop滤镜组中的消除红眼效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
最新文章
- linux nmon
- SpringBatch job执行流程分析(十六)
- Android之Service与IntentService的比较
- 光端机的分类有哪些?
- python连接oracle报错tns_Python3操作oracle数据库及遇到的报错
- winform的ftp方式上传
- python导入自己写的py_10万行代码10万年薪,利用python查看自己写了多少代码!
- 【优化模型】逐步回归算法
- 如何用adb命令启动安装的APK
- 物联网技术-组网技术、应用场景
- 最新的中国风歌曲——《颜如玉》
- 瑞数系列_商标局公告采集
- 1387: [蓝桥杯2018决赛]阅兵方阵
- 恒指期货交易5分钟技巧
- 推荐21款最佳 HTML 5 网页游戏
- 用计算机编程做微信,电脑端微信双开,教你两种简单的方法,上手即用!
- 不要小看了互联网智能锁,它正撬动整个多元化居住产品时代!
- 东京奥运会将采用人脸识别系统 加强安检
- 黑客入侵应急分析手工排查
- ftp服务器文件能预览吗,ftp服务器 文件预览
热门文章
- Charles——charles代理菜单proxy总结—— 开始/暂停模拟慢网速—— stop/start throttling 和 throttling settings...
- redis+Python实现小型动态IP池的搭建,仅需90行代码
- bttnserv.exe
- 根据GPS定位得到的经纬度调用百度地图API在地图上标注
- 云e办(后端)——项目介绍及搭载项目
- 该设备正在使用中,请关闭可能使用该设备的所有程序或窗口,然后重试
- 还要入驻美团酒店被抽成吗?微小程小程序给你自己的平台
- 如何下载酷6、土豆、优酷、56视频并转化格式进行播
- C# 串口CRC CCITT-FALSE 校验
- 关于阿里云服务器购买和域名购买的相关流程