嘴唇识别
主要是采用百度 AI 开放平台的人脸识别,它可以识别人脸的 150 个关键点,其中嘴巴的关键点就有 48 个
熟悉百度 AI 开放平台的小伙伴都知道,需要使用百度控制台的 AK 和 SK 才能生成 access_token 变量
ak = 'xxx' sk = 'xxx' host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + ak + '&client_secret=' + sk response = requests.get(host) if response: access_token = response.json()['access_token'] else: raise Exception('access_token 获取失败')
获取 access_token 后,在网上找一个美女头像图片作为底片,转换成 base64 位格式当做参数请求得到人脸的 150 个关键点
# 图片转 base64 pic_path = '/Users/xx/Desktop/kh/原图.png' with open (pic_path, 'rb') as f: base64_data = base64.b64encode(f.read()) # image:图片,image_type:图片格式,face_field:请求的结果,landmark150为人脸的 150 个关键点 params = '{"image":"'+base64_data.decode('utf-8')+'","image_type":"BASE64","face_field":"landmark150"}' request_url = 'https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=' + access_token headers = {'content-type': 'application/json'} response = requests.post(request_url, data=params, headers=headers) if response: face = response.json() else: raise Exception('人脸关键点获取失败')
示例结果
取到人脸关键点后,参照人脸识别的文档(下图)可以得到嘴唇的 48 个关键点
# 上嘴唇关键点,按顺时针方向的顺序组成一个多边形
mouth_lip_upper_point_list = [ 'mouth_corner_right_outer','mouth_lip_upper_outer_1','mouth_lip_upper_outer_2','mouth_lip_upper_outer_3', 'mouth_lip_upper_outer_4','mouth_lip_upper_outer_5','mouth_lip_upper_outer_6','mouth_lip_upper_outer_7', 'mouth_lip_upper_outer_8','mouth_lip_upper_outer_9','mouth_lip_upper_outer_10','mouth_lip_upper_outer_11', 'mouth_corner_left_outer','mouth_corner_left_inner','mouth_lip_upper_inner_11','mouth_lip_upper_inner_10', 'mouth_lip_upper_inner_9','mouth_lip_upper_inner_8','mouth_lip_upper_inner_7','mouth_lip_upper_inner_6', 'mouth_lip_upper_inner_5','mouth_lip_upper_inner_4','mouth_lip_upper_inner_3','mouth_lip_upper_inner_2', 'mouth_lip_upper_inner_1','mouth_corner_right_inner','mouth_corner_right_outer' ] # 下嘴唇关键点,按顺时针方向的顺序组成一个多边形 mouth_lip_low_point_list = [ 'mouth_corner_right_outer','mouth_corner_right_inner','mouth_lip_lower_inner_1','mouth_lip_lower_inner_2', 'mouth_lip_lower_inner_3','mouth_lip_lower_inner_4','mouth_lip_lower_inner_5','mouth_lip_lower_inner_6', 'mouth_lip_lower_inner_7','mouth_lip_lower_inner_8','mouth_lip_lower_inner_9','mouth_lip_lower_inner_10', 'mouth_lip_lower_inner_11','mouth_corner_left_outer','mouth_lip_lower_outer_11','mouth_lip_lower_outer_10', 'mouth_lip_lower_outer_9','mouth_lip_lower_outer_8','mouth_lip_lower_outer_7','mouth_lip_lower_outer_6', 'mouth_lip_lower_outer_5','mouth_lip_lower_outer_4','mouth_lip_lower_outer_3','mouth_lip_lower_outer_2', 'mouth_lip_lower_outer_1','mouth_corner_right_outer' ] for f in face['result']['face_list']: # 上嘴唇关键点 [(x,y),(x,y),(x,y)] 元组列表 mouth_lip_upper_list = [] # 下嘴唇关键点 [(x,y),(x,y),(x,y)] 元组列表 mouth_lip_low_list = [] for point in mouth_lip_upper_point_list: p = f['landmark150'][point] mouth_lip_upper_list.append((p['x'], p['y'])) for point in mouth_lip_low_point_list: p = f['landmark150'][point] mouth_lip_low_list.append((p['x'], p['y']))
涂口红
在全网都没有找到每种口红所对应的 16 进制颜色,RGBA 的颜色也没有找到,在这里使用笨办法,在天猫上打开一个口红页面,在开发者模式下拾取颜色并复制 16 进制颜色,口红图层使用 mageDraw.Draw
模块的 polygon
函数绘制多边形并填充颜色
# 将将转为可操作的 RGBA 模式 img = Image.open(pic_path) d = ImageDraw.Draw(img, 'RGBA') # 口红颜色 hex = input('请输入口红的16进制颜色:') # 16 进制颜色转 rgba 模式 color = (int(hex[1:3], 16), int(hex[3:5], 16), int(hex[5:7], 16)) # 绘制多边形并填充颜色 d.polygon(mouth_lip_upper_list, fill=color) # 绘制边框并填充颜色 d.line(mouth_lip_upper_list, fill=color, width = 1) d.polygon(mouth_lip_low_list, fill=color) d.line(mouth_lip_low_list, fill=color, width=1) img.show() img.save('/Users/xx/Desktop/kh/' + hex + '.png')
示例结果
总结
通过上面的代码,我们已经可以为女神选出一支适合的口红,祝愿小伙伴们送女神口红都可以成功