现在的美颜特效有多可怕(现在的美颜特效有多可怕视频)

现在的美颜特效有多可怕(现在的美颜特效有多可怕视频)

导语

现在每一次出门,女友就喜欢拍照!BUT 嫌弃我给拍的照片角度不对,采光不好.......

总之一大堆理由,啥时候让我拍照的水平能有美颜相机三分之一的效果就好!​

果然都是锻炼出来的,至少现在我能看出来朋友圈哪些小姐姐批没批过照片。​

​​

​逃不掉​

​逃不掉啊,为了摆脱这种局面——

立马给女友写了一款简易版本的美颜相机给她偷偷地用!这样子就不担心被锤了。机智如我.jpg

正文

环境安装:

dlib库的安装 本博客提供三种方法进行安装

T1方法:pip install dlib

此方法是需要在你安装cmake、Boost环境的计算机使用 T2方法:conda install -c menpo dlib=18.18

此方法适合那些已经安装好conda库的环境的计算机使用, T3方法:pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl

dlib库的whl文件——dlib-19.7.0-cp36-cp36m-win_amd64.rar

dlib-19.3.1-cp35-cp35m-win_amd64.whl

​cv2库安装方法:

pip install opencv-python

人脸五官,坐标、进行高斯模糊处理等等。

# 五官

class Organ():

def __init__(self,img,img_hsv,temp_img,temp_hsv,landmarks,name,ksize=None):

self.img = img

self.img_hsv = img_hsv

self.landmarks = landmarks

self.name = name

self.get_rect()

self.shape = (int(self.bottom-self.top),int(self.right-self.left))

self.size = self.shape[0] * self.shape[1] * 3

self.move = int(np.sqrt(self.size/3)/20)

self.ksize = self.get_ksize()

self.patch_img,self.patch_hsv = self.get_patch(self.img),self.get_patch(self.img_hsv)

self.set_temp(temp_img,temp_hsv)

self.patch_mask = self.get_mask_relative()

# 获取定位方框

def get_rect(self):

y,x = self.landmarks[:,1],self.landmarks[:,0]

self.top,self.bottom,self.left,self.right = np.min(y),np.max(y),np.min(x),np.max(x)

# 获得ksize,高斯模糊处理的参数

def get_ksize(self,rate=15):

size = max([int(np.sqrt(self.size/3)/rate),1])

size = (size if size%2==1 else size+1)

return(size,size)

# 截取局部切片

def get_patch(self,img):

shape = img.shape

return img[np.max([self.top-self.move,0]): np.min([self.bottom+self.move,shape[0]]),np.max([self.left-self.move,0]): np.min([self.right+self.move,shape[1]])]

def set_temp(self,temp_hsv):

self.img_temp,self.hsv_temp = temp_img,temp_hsv

self.patch_img_temp,self.patch_hsv_temp = self.get_patch(self.img_temp),self.get_patch(self.hsv_temp)

# 确认

def confirm(self):

self.img[:],self.img_hsv[:] = self.img_temp[:],self.hsv_temp[:]

# 更新

def update_temp(self):

self.img_temp[:],self.hsv_temp[:] = self.img[:],self.img_hsv[:]

# 勾画凸多边形

def _draw_convex_hull(self,points,color):

points = cv2.convexHull(points)

cv2.fillConvexPoly(img,color=color)

# 获得局部相对坐标遮盖

def get_mask_relative(self,ksize=None):

if ksize == None:

ksize = self.ksize

landmarks_re = self.landmarks.copy()

landmarks_re[:,1] -= np.max([self.top-self.move,0])

landmarks_re[:,0] -= np.max([self.left-self.move,0])

mask = np.zeros(self.patch_img.shape[:2],dtype=np.float64)

self._draw_convex_hull(mask,landmarks_re,color=1)

mask = np.array([mask,mask,mask]).transpose((1,2,0))

mask = (cv2.GaussianBlur(mask,ksize,0) > 0) * 1.0

return cv2.GaussianBlur(mask,0)[:]

# 获得全局绝对坐标遮盖

def get_mask_abs(self,ksize=None):

if ksize == None:

ksize = self.ksize

mask = np.zeros(self.img.shape,dtype=np.float64)

patch = self.get_patch(mask)

patch[:] = self.patch_mask[:]

return mask

主要美颜效果进行的处理如下:

# 美白

def whitening(self,rate=0.15,confirm=True):

if confirm:

self.confirm()

self.patch_hsv[:,:,-1] = np.minimum(self.patch_hsv[:,-1]+self.patch_hsv[:,-1]*self.patch_mask[:,-1]*rate,255).astype('uint8')

self.img[:]=cv2.cvtColor(self.img_hsv,cv2.COLOR_HSV2BGR)[:]

self.update_temp()

else:

self.patch_hsv_temp[:] = cv2.cvtColor(self.patch_img_temp,cv2.COLOR_BGR2HSV)[:]

self.patch_hsv_temp[:,-1] = np.minimum(self.patch_hsv_temp[:,-1]+self.patch_hsv_temp[:,255).astype('uint8')

self.patch_img_temp[:] = cv2.cvtColor(self.patch_hsv_temp,cv2.COLOR_HSV2BGR)[:]

# 提升鲜艳度

def brightening(self,rate=0.3,confirm=True):

patch_mask = self.get_mask_relative((1,1))

if confirm:

self.confirm()

patch_new = self.patch_hsv[:,1]*patch_mask[:,1]*rate

patch_new = cv2.GaussianBlur(patch_new,(3,3),0)

self.patch_hsv[:,1] = np.minimum(self.patch_hsv[:,1]+patch_new,cv2.COLOR_BGR2HSV)[:]

patch_new = self.patch_hsv_temp[:,0)

self.patch_hsv_temp[:,cv2.COLOR_HSV2BGR)[:]

# 磨平

def smooth(self,rate=0.6,ksize=None,confirm=True):

if ksize == None:

ksize=self.get_ksize(80)

index = self.patch_mask > 0

if confirm:

self.confirm()

patch_new = cv2.GaussianBlur(cv2.bilateralFilter(self.patch_img,3,*ksize),0)

self.patch_img[index] = np.minimum(rate*patch_new[index]+(1-rate)*self.patch_img[index],255).astype('uint8')

self.img_hsv[:] = cv2.cvtColor(self.img,cv2.COLOR_BGR2HSV)[:]

self.update_temp()

else:

patch_new = cv2.GaussianBlur(cv2.bilateralFilter(self.patch_img_temp,0)

self.patch_img_temp[index] = np.minimum(rate*patch_new[index]+(1-rate)*self.patch_img_temp[index],255).astype('uint8')

self.patch_hsv_temp[:] = cv2.cvtColor(self.patch_img_temp,cv2.COLOR_BGR2HSV)[:]

# 锐化

def sharpen(self,confirm=True):

patch_mask = self.get_mask_relative((3,3))

kernel = np.zeros((9,9),np.float32)

kernel[4,4] = 2.0

boxFilter = np.ones((9,np.float32) / 81.0

kernel = kernel - boxFilter

index = patch_mask > 0

if confirm:

self.confirm()

sharp = cv2.filter2D(self.patch_img,-1,kernel)

self.patch_img[index] = np.minimum(((1-rate)*self.patch_img)[index]+sharp[index]*rate,255).astype('uint8')

self.update_temp()

else:

sharp = cv2.filter2D(self.patch_img_temp,kernel)

self.patch_img_temp[:] = np.minimum(self.patch_img_temp+self.patch_mask*sharp*rate,cv2.COLOR_BGR2HSV)[:]

# 额头

class ForeHead(Organ):

def __init__(self,mask_organs,ksize=None):

self.mask_organs = mask_organs

super(ForeHead,self).__init__(img,ksize)

# 获得局部相对坐标mask

def get_mask_relative(self,0) > 0) * 1.0

patch_organs = self.get_patch(self.mask_organs)

mask= cv2.GaussianBlur(mask,0)[:]

mask[patch_organs>0] = (1-patch_organs[patch_organs>0])

return mask

# 脸类

class Face(Organ):

def __init__(self,index):

self.index = index

# 五官:下巴、嘴、鼻子、左右眼、左右耳

self.organs_name = ['jaw','mouth','nose','left_eye','right_eye','left_brow','right_brow']

# 五官标记点

self.organs_point = [list(range(0,17)),list(range(48,61)),

list(range(27,35)),list(range(42,48)),

list(range(36,42)),list(range(22,27)),

list(range(17,22))]

self.organs = {name: Organ(img,landmarks[points],name) for name,points in zip(self.organs_name,self.organs_point)}

# 额头

mask_nose = self.organs['nose'].get_mask_abs()

mask_organs = (self.organs['mouth'].get_mask_abs()+mask_nose+self.organs['left_eye'].get_mask_abs()+self.organs['right_eye'].get_mask_abs()+self.organs['left_brow'].get_mask_abs()+self.organs['right_brow'].get_mask_abs())

forehead_landmark = self.get_forehead_landmark(img,mask_nose)

self.organs['forehead'] = ForeHead(img,forehead_landmark,'forehead')

mask_organs += self.organs['forehead'].get_mask_abs()

# 人脸的完整标记点

self.FACE_POINTS = np.concatenate([landmarks,forehead_landmark])

super(Face,self.FACE_POINTS,'face')

mask_face = self.get_mask_abs() - mask_organs

self.patch_mask = self.get_patch(mask_face)

# 计算额头坐标

def get_forehead_landmark(self,face_landmark,mask_nose):

radius = (np.linalg.norm(face_landmark[0]-face_landmark[16])/2).astype('int32')

center_abs = tuple(((face_landmark[0]+face_landmark[16])/2).astype('int32'))

angle = np.degrees(np.arctan((lambda l:l[1]/l[0])(face_landmark[16]-face_landmark[0]))).astype('int32')

mask = np.zeros(mask_organs.shape[:2],dtype=np.float64)

cv2.ellipse(mask,center_abs,(radius,radius),angle,180,360,1,-1)

# 剔除与五官重合部分

mask[mask_organs[:,0]>0]=0

# 根据鼻子的肤色判断真正的额头面积

index_bool = []

for ch in range(3):

mean,std = np.mean(img[:,ch][mask_nose[:,ch]>0]),np.std(img[:,ch]>0])

up,down = mean+0.5*std,mean-0.5*std

index_bool.append((img[:,ch]up))

index_zero = ((mask>0)&index_bool[0]&index_bool[1]&index_bool[2])

mask[index_zero] = 0

index_abs = np.array(np.where(mask>0)[::-1]).transpose()

landmark = cv2.convexHull(index_abs).squeeze()

return landmark

# 化妆器

class Makeup():

def __init__(self,predictor_path='./predictor/shape_predictor_68_face_landmarks.dat'):

self.photo_path = []

self.predictor_path = predictor_path

self.faces = {}

# 人脸检测与特征提取

self.detector = dlib.get_frontal_face_detector()

self.predictor = dlib.shape_predictor(self.predictor_path)

# 人脸定位和特征提取

# img为numpy数组

# 返回值为人脸特征(x,y)坐标的矩阵

def get_faces(self,n=1):

rects = self.detector(img,1)

if len(rects) < 1:

print('[Warning]:No face detected...')

return None

return {name: [Face(img,np.array([[p.x,p.y] for p in self.predictor(img,rect).parts()]),i) for i,rect in enumerate(rects)]}

# 读取图片

def read_img(self,fname,scale=1):

img = cv2.imdecode(np.fromfile(fname,dtype=np.uint8),-1)

if not type(img):

print('[ERROR]:Fail to Read %s' % fname)

return None

return img

def read_and_mark(self,fname):

img = self.read_img(fname)

img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

temp_img,temp_hsv = img.copy(),img_hsv.copy()

return img,self.get_faces(img,fname))|(img[:,>

效果如下:


​​嘿嘿——小姐姐美颜之后是不是白了很多吖!

总结

本次文章就到这里啦!如需完整地打包好的项目源码基地见:【私信小编06】即可免费领取!

记得关注、评论、点赞三连哦~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


有系统u盘要网络吗(有系统u盘要网络吗怎么连接)想要重新系统/维护少不了PE系统,目前网络上PE系统选择也挺多的,但是有些会内置捆绑推广内容。所以今天给大家分享「CMDPE」这个支持网络功能的纯净PE系统、可以上
u盘识别盘符不能格式化(u盘无法识别需要格式化)因为重装系统的原因,很多时候我们要将U盘作为系统启动盘,但是事后我们想要将U盘格式化,却发现无论怎么格式化,U盘空间无法释放。今天为大家做一个U盘启动教程,以备后用。1.右键单击计算机,点击管理。打开管理界面
u盘错误无法读取(u盘错误无法读取文件)U盘无法读取?出现这种状况的原因太多了。但有一种状况是经常发生的,那就是U盘在自己的电脑里读不出来,但在桌面右下角又有U盘的图标,而在电脑里却怎么也找不着,这是怎么回事呢?如果你将
电脑f2启动相应系统(电脑f2启动相应系统错误)开机后出现如下图界面,无法进入系统。我们看最后两条:尝试按F1,可以进入了BIOS,而按F2却一直卡着,无法进入系统,一会之后又自动关机。其实这是某品牌主板的通病,特别是一些低端的主板。在我
win7直接启动(win7直接启动admin)一共三种启动方式,针对台式机[给力][给力]第一种“冷启动”,又称“加电启动”,需要经过硬件自检第二种“重新启动”,由于是开机状态下进行重启,所以不需要硬件自检第三种“复位启动”,类似“冷启动”,但不需要重新打开电源。按下主机上的“Reset”复位开关即可。这是水淼·帝国CMS站群文章更新器的试用版本更新的文章,故
近期有些win7用户反映说,自己的电脑使用过程中就出现了蓝屏0x0000007b错误,需要经常重启,面对这个问题,很多小伙伴都不知道应该怎么解决,那么今天编程之家小编就来和广大用户们分享三种解决方法,有需要的用户都可以进行尝试,希望本期win7教程带来的内容可以解答大伙的问题,接下来跟随小编的步伐一起来看看详细步骤。
win7系统提示已关闭无线功能未能修复怎么解决?最近有些小伙伴想要连接无线网络的时候,弹出了提示,随后wlan图标就会变成了红色,这个是因为我们相关的功能都已经关闭了,因此才会无法连接使用,那么要如何重新设置修复开启呢,今日的win7教程就为大伙带来两种解决方法,有需要的用户欢迎来编程之家查看详细方法吧。
我们在使用win10系统的时候会经常的使用到复制粘贴功能,但是也有不少的用户们遇到了win10复制粘贴快捷键失效怎么办?用户们可以打开任务管理器下的windows资源管理器来进行操作就可以了。下面就让本站来为用户们来仔细的介绍一下win10复制粘贴快捷键失效解决方法吧。
最近有些升级到win11系统的用户遇到了cpu锁频的情况,导致整体的使用变得不流畅,锁频很经常发生,每次都需要手动去调整才能够恢复,面对这个问题,很多人都不清楚该怎么解决,那么今日的win11教程就来为广大用户们进行解答,接下来让我们一起来看看具体的操作步骤吧。
我们有些win10系统用户,电脑没有了声音,通过检测,发现是声卡驱动出现了问题,想要安装新的驱动程序,我们就需要将旧的声卡驱动卸载,有些小白不知道怎么卸载重装,针对这个问题,今日的win10教程就来为广大用户们进行解答,希望今天本站分享的内容可以帮助大伙解决问题。
win11防火墙关闭后还是会拦截怎么办?有些小伙伴因为程序或者是文件被防火墙拦截,经常打不开,因此关闭了,可是关闭后还是会提示某些内容被拦截,出现这个问题可能是部分对应的服务功能没有关闭,所以还能够进行拦截,那么今天编程之家小编就来和大伙分享详细的解决方法,希望今日的win11教程可以帮助更多人解答问。
一些win11系统用户,明明声音已经开得很大了,可是整体还是比较小,这个问题我们可以设置增强音频,那么就可以很大程度的提升音量,不少小伙伴不知道该怎么操作,接下来本期的win11教程就来为广大用户们进行解答,一起来看看详细的操作步骤吧。
我们win10电脑中有一个系统保护,这个功能可以保护电脑不会受到病毒的攻击,但是同时也会将一些常用的程序或者是文件错误拦截,每次都需要添加白名单,因此不少小伙伴想要直接关闭系统保护,可是不知道设置方法,本期的win10教程就来和广大用户们分享设置方法,有兴趣的小伙伴随时欢迎来编程之家查看完整步骤吧。
win10系统提示shellappsfolder没有注册类怎么解决?在安装或者是运行某些程序的时候,就会出现这个提示,都是以失败告终,面对这个问题,很多人都不清楚应该用什么方法来进行解决,那么本期的win10教程就来为广大用户们进行解答,接下来让我们一起来看看详细的操作步骤吧。
win10本地账户无法删除怎么解决?我们在使用win10系统的时候会发现自己的本地账户不能删除的情况,那么用户们遇到这种情况要怎么解决?用户们可以直接的打开控制面板下来进行操作就可以了。下面就让本站来为用户们来仔细的介绍一下win10本地账户无法删除的解决方法吧。
我们在使用win11的时候会发现任务栏的高度有点高,对一些用户们来说感觉有点不美观,那么win11任务栏高度怎么缩小?用户们可以直接的点击开始菜单下的注册表编辑器,然后找到Advanced文件夹来进行操作就可以了。下面就让本站来为用户们来仔细的介绍一下windows11调整任务栏大小的方法吧。
win11打开文件夹一直转圈圈怎么办?我们在使用win11系统的时候有时候需要打开文件夹,但是也有不少的用户们在询问打开文件夹的时候一直在转圈圈,那么这要怎么办?用户们可以直接的找到计算机下的Shell Extensions文件夹来进行操作,下面就让本站来为用户们来仔细的介绍一下win11打开文件夹一直转圈圈详解吧。
我们在使用win11系统的时候有时候会需要使用到hyper-v选项,但是也有不少的用户们在询问win11没有hyper-v选项怎么办?用户们可以直接的新建一个文本文档,然后复制下面的代码来进行操作就可以了,下面就让本站来为用户们来仔细的介绍一下win11找不到hyper-v选项问题解析吧。
ROG 枪神6 Plus笔记本搭载了4芯90Wh锂离子电池,续航能力强大,可以满足用户长时间使用的需求,但是也有不少的用户们在询问ROG 枪神6 Plus笔记本怎么重装win7系统,下面就让本站来为用户们来仔细的介绍一下ROG 枪神6 Plus笔记本重装win7系统教程吧。
win10网页拦截设置怎么取消?我们在使用win10系统的时候会发现自己网页被拦截了,这就使得很多用户们发现都不能进入到网页里面,那么这是怎么回事?用户们可以直接的找到浏览器下的设置然后来进行操作就可以了。下面就让本站来为用户们来仔细的介绍一下win10网页拦截设置取消方法吧。