opencv+Dlib python瘦脸代码
1.瘦脸结果图
import dlib
import cv2
import numpy as np
import math
predictor_path = ‘shape_predictor_68_face_landmarks.dat’
使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)
def landmark_dec_dlib_fun(img_src):#转灰度图img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)cv2.imshow('grayimg',img_gray)land_marks = []rects = detector(img_gray, 0)print(rects)for i in range(len(rects)):land_marks_node = np.matrix([[p.x, p.y] for p in predictor(img_gray, rects[i]).parts()])for idx,point in enumerate(land_marks_node):# 68点坐标pos = (point[0,0],point[0,1])print(idx,pos)# 利用cv2.circle给每个特征点画一个圈,共68个cv2.circle(img_src, pos, 5, color=(0, 255, 0))# 利用cv2.putText输出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img_src, str(idx + 1), pos, font, 0.5, (0, 0, 0), 1, cv2.LINE_AA)land_marks.append(land_marks_node)return land_marks
图像局部扭曲算法有三个:局部缩放(Local Scaling)算法、局部平移(Local Transition)算法和局部旋转(Local Rotation)算法。其中应用局部缩放算法可实现眼睛放大,局部平移算法则可用于实现瘦脸效果。
'''
方法: Interactive Image Warping 局部平移算法
'''#startX, startY,left_landmark[0, 0], left_landmark[0, 1]
#endPt[0, 0], endPt[0, 1]
#r_left,r_right为半径
def localTranslationWarp(srcImg, startX, startY, endX, endY, radius):ddradius = float(radius * radius)copyImg = np.zeros(srcImg.shape, np.uint8)copyImg = srcImg.copy()# 计算公式中的|m-c|^2ddmc = (endX - startX) * (endX - startX) + (endY - startY) * (endY - startY)H, W, C = srcImg.shapefor i in range(W):for j in range(H):# 计算该点是否在形变圆的范围之内# 优化,第一步,直接判断是会在(startX,startY)的矩阵框中if math.fabs(i - startX) > radius and math.fabs(j - startY) > radius:continuedistance = (i - startX) * (i - startX) + (j - startY) * (j - startY)if (distance < ddradius):# 计算出(i,j)坐标的原坐标# 计算公式中右边平方号里的部分ratio = (ddradius - distance) / (ddradius - distance + ddmc)ratio = ratio * ratio# 映射原位置UX = i - ratio * (endX - startX)UY = j - ratio * (endY - startY)# 根据双线性插值法得到UX,UY的值value = BilinearInsert(srcImg, UX, UY)# 改变当前 i ,j的值copyImg[j, i] = valuereturn copyImg
def BilinearInsert(src, ux, uy):w, h, c = src.shapeif c == 3:x1 = int(ux)x2 = x1 + 1y1 = int(uy)y2 = y1 + 1part1 = src[y1, x1].astype(np.float) * (float(x2) - ux) * (float(y2) - uy)part2 = src[y1, x2].astype(np.float) * (ux - float(x1)) * (float(y2) - uy)part3 = src[y2, x1].astype(np.float) * (float(x2) - ux) * (uy - float(y1))part4 = src[y2, x2].astype(np.float) * (ux - float(x1)) * (uy - float(y1))insertValue = part1 + part2 + part3 + part4return insertValue.astype(np.int8)def face_thin_auto(src):#68个关键点二维数组landmarks = landmark_dec_dlib_fun(src)# 如果未检测到人脸关键点,就不进行瘦脸if len(landmarks) == 0:returnfor landmarks_node in landmarks:#第4个点左left_landmark = landmarks_node[3]#第6个点左left_landmark_down = landmarks_node[5]#第14个点右right_landmark = landmarks_node[13]#第16个点右right_landmark_down = landmarks_node[15]#第31个点鼻尖endPt = landmarks_node[30]# 计算第4个点到第6个点的距离作为瘦脸距离r_left = math.sqrt((left_landmark[0, 0] - left_landmark_down[0, 0])== * (left_landmark[0, 0] - left_landmark_down[0, 0]) +(left_landmark[0, 1] - left_landmark_down[0, 1]) * (left_landmark[0, 1] - left_landmark_down[0, 1]))# 计算第14个点到第16个点的距离作为瘦脸距离r_right = math.sqrt((right_landmark[0, 0] - right_landmark_down[0, 0]) * (right_landmark[0, 0] - right_landmark_down[0, 0]) +(right_landmark[0, 1] - right_landmark_down[0, 1]) * (right_landmark[0, 1] - right_landmark_down[0, 1]))# 瘦左边脸thin_image = localTranslationWarp(src, left_landmark[0, 0], left_landmark[0, 1], endPt[0, 0], endPt[0, 1],r_left)# 瘦右边脸thin_image = localTranslationWarp(thin_image, right_landmark[0, 0], right_landmark[0, 1], endPt[0, 0],endPt[0, 1], r_right)# 显示cv2.imshow('thin', thin_image)cv2.imwrite('thin.jpg', thin_image)
src = cv2.imread('1.jpg')
cv2.imshow('src', src)
face_thin_auto(src)
# cv2.waitKey(0)img = cv2.imread('1.jpg')
rects = detector(img, 0)
print(rects)
#绘制关键点
for i in range(len(rects)):land_marks_node = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])for idx,point in enumerate(land_marks_node):# 68点坐标pos = (point[0,0],point[0,1])print(idx,pos)# 利用cv2.circle给每个特征点画一个圈,共68个cv2.circle(img, pos, 5, color=(0, 255, 0))# 利用cv2.putText输出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(idx + 1), pos, font, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
cv2.imshow('img', img)
cv2.waitKey(0)
opencv+Dlib python瘦脸代码相关推荐
- 人脸识别系统OpenCV+dlib+python(含数据库)Pyqt5界面设计 项目源码 毕业设计
一.项目主要技术 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量 ...
- 使用OpenCV和Python进行对象检测和跟踪
在此功能中,我将介绍使用OpenCV和Python代码设置对象检测和跟踪所需的功能.使用随附的代码片段,您可以轻松设置Raspberry Pi和网络摄像头,以便制作用于物体检测的便携式图像传感器. 本 ...
- 使用Python+OpenCV+dlib为人脸生成口罩
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...
- 表情识别(二)——使用Dlib、opencv和Python标记和提取脸部的特定区域
文章目录 使用Dlib.OpenCV和Python检测眼睛,鼻子,嘴唇和下巴引用函数 特征点和不同人脸部位的关系 可视化每一个人脸的部位特征 使用Dlib.OpenCV和Python提取脸的局部主函数 ...
- 人脸检测进阶:使用 dlib、OpenCV 和 Python 检测面部标记
使用 dlib.OpenCV 和 Python 检测面部标记 今天,我们将使用dlib和OpenCV来检测图像中的面部标记.dlib的安装教程: https://wanghao.blog.csdn.n ...
- dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码
请直接访问原文章 dlib 使用OpenCV,Python和深度学习进行人脸识别 源代码 https://hotdog29.com/?p=595 在 2019年7月7日 上张贴 由 hotdog发表回 ...
- Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测
点击查看:Python+OpenCV+dlib汽车驾驶员疲劳驾驶检测 文件大小:80M 操作系统:Windows10旗舰版 开发工具:Python3.8.OpenCV4.5.dlib 开发语言:.py ...
- 面部表情识别java_使用Python+OpenCV+dlib为人脸生成口罩
来源:深度学习与计算机视觉 本文约4800字,建议阅读6分钟本文试图用OpenCV和dlib库来实现这个过程,在这里我们综合生成5种类型的口罩来绘制人脸图像. 本文使用OpenCV dlib库生成口罩 ...
- 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)
作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...
- python+opencv+dlib实现人脸检测与表情识别
python+opencv+dlib实现人脸检测与表情识别 一,dlib简单介绍:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起 ...
最新文章
- 看完就能知道渗透测试的技术结构
- 为什么 SAP 电商云 Spartacus 产品明细页面的自定义 matcher 会重复被调用
- python元类_Python元类
- 我的第一次--我与51CTO的故事
- 个人打卡签到表html代码,考勤每日签到表模板
- Android 代码管理技巧
- 新时代火热技术栈:大数据->人工智能(AI)->区块链
- jQWidgets API 笔记
- 2007世界各国GDP排名
- Unity一键发包工具
- Android studio中todo的用法
- sencha app watch php,使用新的SenchaCmd4命令appwatch
- 自然保护区相关矢量数据下载
- 15.内置函数,匿名函数
- 发送到谷歌邮箱的邮件在哪找_如何让Google表格为您发送个性化电子邮件
- 挂载ISO镜像文件作为本地yum源
- RFM模型与Spark实现
- 一场关于Android的争论
- 《圈外课程学习记录》3.2 数据化强力说服
- Dubbo高频面试题+解析:dockerinstall未找到命令