dlib实现红眼特效

news/2024/10/18 2:38:47/

效果

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


在这里插入图片描述
在这里插入图片描述

摘要

技术栈如下:

代码演示: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

问题

所有这种直接在平面贴图的方式,都会面临透视的问题。当用户面部倾斜,并且人的眼部本身就不是在一个平面上,这种情况下的处理结果则很不理想。无法通过正面遮挡,弥补这种处理的缺点。


**更多功能,或者想体验一下,可以扫下方二维码:**

在这里插入图片描述


主业前端程序猿一枚。图片处理方面,作为业余爱好。如有错误,请各位大佬轻喷,谢谢!!😂

http://www.ppmy.cn/news/784117.html

相关文章

数字图像处理——红眼去除(Python)

输入的图像一般都是RGB三层&#xff0c;但是红眼区域的定义是在HSI空间上进行定义&#xff0c;因此需要存在两个函数将图像数据在RGB空间与HSI空间进行转换&#xff0c;而转换的公式如下图所示&#xff1a; 原始图片数据&#xff1a; 实验代码&#xff1a; import mathi…

k8s的资源配置清单的管理操作

目录 一、资源配置清单1.1 初步认识资源清单中svc的重要配置项1.2 手动编写 svc资源配置1.3 手动生成模板&#xff0c;再编写资源清单1.4 写yaml太累怎么办&#xff1f;1.5 官网下载资源模板 一、资源配置清单 Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#…

sqlserver数据库命令行客户端安装

项目情况 项目上需要通过执行sql语句去更新一些功能 直接进入数据库去进行执行太麻烦&#xff0c; 对基础技术人员的要求比较高&#xff0c;执行效率低 参考资料 sqlcmd 实用工具 - SQL Server | Microsoft Learn 下载 ODBC Driver for SQL Server - ODBC Driver for SQL S…

Windows 10 启动出现蓝屏 终止代码:UNMOUNTABLE_BOOT_VOLUME

解决办法&#xff1a;在命令符窗口中【管理员权限】 1、– 修复Windows文件&#xff1a;损坏的Windows文件可能会导致严重的问题。 sfc /scannow2 、– 修复硬盘&#xff1a;确保您的硬盘依次运行&#xff0c;以及Windows。 chkdsk c: /f 或 chkdsk /f 或 chkdsk /r

win10蓝屏:终止代码:CRITICAL_PROCESS_DIED

1.硬件驱动问题 Win X打开设备管理器-扫描检测硬件改动 看是否有硬件驱动问题&#xff08;黄色标识&#xff09;&#xff0c;有的话更新或卸载重装 2.查看蓝屏原因 使用软件&#xff1a; BlueScreenView WinX - 时间查看器 window日志-系统&#xff1a;红色错误标识为系统错误…

windows10打印蓝屏 失败的操作win32kfull.sys 终止代码 APC-INDEX-MISMATCH解决方法

1、打开控制面板&#xff08;可以在右下角搜索栏搜索“控制面板”&#xff09; 2、找到点击卸载程序 3、弹出程序和功能点击&#xff08;查看已安装的更新&#xff09; 4、卸载微软更新补丁&#xff08;kb5000808&#xff09; 5、如果想关闭微软系统更新打开设置——点击更…

Pytorch—提前终止代码

前言 以前使用keras的时候有一个很方便的提前终止类&#xff0c;而pytorch每次都要自己写一次&#xff0c;因此我整理了一个简单通用的代码&#xff0c;需要提前终止功能时&#xff0c;只需cv一下&#xff0c;避免了每次重复写的麻烦。 代码 class EarlyStopping(object):de…

windows10启动虚拟机就会蓝屏,终止代码:SYSTEM_SERVICE_EXCEPTION(全网权威解决方法!)

前言 没错就是这个,绿色的死亡按钮 原因: 第一种:windows更新原因,正是因为windows系统更新了造成了系统与软件之间不兼容!第二种:没有第二种,(狗头.jpg) 解决方案: 既然是更新问题,就把最近更新的补丁卸载了就行! 进入程序和功能,看安装时间&#xff0c;找到上一次更新时…