效果

(图片来源网络,如有侵权请联系删除)


摘要

技术栈如下:

代码演示: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实现红眼特效相关推荐

  1. autojs红眼特效

    牙叔教程 简单易学 效果展示 autojs版本 8.8.2-0 代码简介 识别眼睛, 使用的是百度的人脸检测 在眼睛的位置, 画红眼特效, 使用了阴影, 模糊 红眼特效区域使用path.quadTo画 ...

  2. C++坑人游戏[1.0版本](完)

    本次如期增加: 1.Penta Kill 和 Shut Down 2.红眼特效的音乐 本次额外增加(VS版): 反Alt+F4机制 但是,我这才发现Dev-C++好像不支持多线程--所以如果是用Dev ...

  3. 沉睡者IT - 4种在家就能带货赚钱的直播课-视频教程目录

    抖音引流培训课程视频教程讲座简介: <4种在家就能带货赚钱的直播课>人人都能直播,适合在家一个人操作! 课程内容目录: 一.直播课 01.直播赛道解析.mp4 02.测试效果型-制作产品型 ...

  4. 绝绝子还是YYDS,2021国民年度流行语出炉

    2021年临近尾声,搜狗输入法保持传统,通过征集整理网友投稿发布#2021国民年度流行语#TOP100超级榜. 根据搜狗输入法官方微博显示,今年各大网络文学粉墨登场,缩写梗层出不穷,新闻热评和娱乐事件 ...

  5. 【Linux】Ubuntu 可以不用安装 yum

            欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行.动静不失其时,其道光明.  目录 1.缘起 2.yum 命令和 apt 命令 3.总结 1.缘起 最近在 Bi ...

  6. python实现面部特效_Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  7. 创意赛第二季又来了,PaddleHub人脸关键点检测实现猫脸人嘴特效

    前段时间,下班后闲来无事,参加了百度PaddleHub的AI人像抠图创意赛,凭借着大家的阅读量,获得了一个第三名,得了一个小度音响,真香啊! 对,说的是我 小奖品 PaddleHub创意赛第二期又出来 ...

  8. 超火AI变脸特效来袭!马云蔡徐坤一起《吗咿呀嘿》 网友:摇不能停

    来源/雷锋网 ID/leiphone-sz 记者/贝爽 蚂蚁呀嘿,蚂蚁牙呼,蚂蚁牙呼呼呼~ 相信不少朋友一大早就被这首"蚂蚁呀嘿"洗脑了,这个BGM原本出自新加坡歌手郭美美的< ...

  9. C# vb .net实现消除红眼效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的消除红眼效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

最新文章

  1. linux nmon
  2. SpringBatch job执行流程分析(十六)
  3. Android之Service与IntentService的比较
  4. 光端机的分类有哪些?
  5. python连接oracle报错tns_Python3操作oracle数据库及遇到的报错
  6. winform的ftp方式上传
  7. python导入自己写的py_10万行代码10万年薪,利用python查看自己写了多少代码!
  8. 【优化模型】逐步回归算法
  9. 如何用adb命令启动安装的APK
  10. 物联网技术-组网技术、应用场景
  11. 最新的中国风歌曲——《颜如玉》
  12. 瑞数系列_商标局公告采集
  13. 1387: [蓝桥杯2018决赛]阅兵方阵
  14. 恒指期货交易5分钟技巧
  15. 推荐21款最佳 HTML 5 网页游戏
  16. 用计算机编程做微信,电脑端微信双开,教你两种简单的方法,上手即用!
  17. 不要小看了互联网智能锁,它正撬动整个多元化居住产品时代!
  18. 东京奥运会将采用人脸识别系统 加强安检
  19. 黑客入侵应急分析手工排查
  20. ftp服务器文件能预览吗,ftp服务器 文件预览

热门文章

  1. Charles——charles代理菜单proxy总结—— 开始/暂停模拟慢网速—— stop/start throttling 和 throttling settings...
  2. redis+Python实现小型动态IP池的搭建,仅需90行代码
  3. bttnserv.exe
  4. 根据GPS定位得到的经纬度调用百度地图API在地图上标注
  5. 云e办(后端)——项目介绍及搭载项目
  6. 该设备正在使用中,请关闭可能使用该设备的所有程序或窗口,然后重试
  7. 还要入驻美团酒店被抽成吗?微小程小程序给你自己的平台
  8. 如何下载酷6、土豆、优酷、56视频并转化格式进行播
  9. C# 串口CRC CCITT-FALSE 校验
  10. 关于阿里云服务器购买和域名购买的相关流程