3943浏览
查看: 3943|回复: 2

【行空板】“三庭五眼”测测你的美貌

[复制链接]
本帖最后由 云天 于 2022-5-21 08:32 编辑

想测试一下自己的颜值,但结果哭了。下面开始。


【三庭五眼】

【行空板】“三庭五眼”测测你的美貌图1
三庭:指脸的长度比例,把脸的长度分为三个等分,从前额发际线眉骨,从眉骨至鼻底,从鼻底至下颏,各占脸长的1/3。
五眼:指脸的宽度比例,以眼形长度为单位,把脸的宽度分成五个等分,从左侧发际至右侧发际,为五只眼形。两只眼睛之间有一只眼睛的间距,两眼外侧至侧发际各为一只眼睛的间距,各占比例的1/5。
“三庭五眼”是人的脸长与脸宽的一般标准比例,不符合此比例,就会与理想的脸型产生距离。
本演示只使用了“五眼”,重点是学习“范数”。

【范数
通过Mediapipe获取脸上关键点轮廓的坐标,再计算这五个距离,如何最终使用一个量作为比较值,我使用“范数”。
范数主要是对矩阵和向量的一种描述,有了描述那么“大小就可以比较了”,从字面理解一种比较构成规范的数。有了统一的规范,就可以比较了。

例如:1比2小我们一目了然,可是(3,5,3)和(6,1,2)哪个大?不太好比吧
2范数比:根号(43)比根号(41)大,因此2范数对比中(3,5,3)大
无穷范数比:5比6小,因此无穷范数对比中(6,1,2)大

矩阵范数:描述矩阵引起变化的大小,AX=B,矩阵X变化了A个量级,然后成为了B。
向量范数:描述向量在空间中的大小。
更一般地可以认为范数可以描述两个量之间的距离关系。

向量范数的通用公式为L-P范数

记住该公式其他公式都是该公式的引申。
L-0范数:用来统计向量中非零元素的个数。
L-1范数:向量中所有元素的绝对值之和。可用于优化中去除没有取值的信息,又称稀疏规则算子。
L-2范数:典型应用——欧式距离。可用于优化正则化项,避免过拟合。
L-∞范数:计算向量中的最大值。
————————————————
-范数的定义
-范数表示向量(或矩阵)的元素平方和开根号,即
【图片颜值测试】
python计算范数
np.linalg.norm




  1. # 颜值打分--五眼指标
  2. import cv2 as cv
  3. import  mediapipe as mp
  4. import numpy as np
  5. import time
  6. import  matplotlib.pyplot as plt
  7. # 定义可视化图像函数
  8. def look_img(img):
  9.     img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
  10.     plt.imshow(img_RGB)
  11.     plt.show()
  12. # 导入三维人脸关键点检测模型
  13. mp_face_mesh=mp.solutions.face_mesh
  14. # help(mp_face_mesh.FaceMesh)
  15. model=mp_face_mesh.FaceMesh(
  16.     static_image_mode=True,#TRUE:静态图片/False:摄像头实时读取
  17.     max_num_faces=40,
  18.     min_detection_confidence=0.5, #置信度阈值,越接近1越准
  19.     min_tracking_confidence=0.5,#追踪阈值
  20. )
  21. # 导入可视化函数和可视化样式
  22. mp_drawing=mp.solutions.drawing_utils
  23. # mp_drawing_styles=mp.solutions.drawing_styles
  24. draw_spec=mp_drawing.DrawingSpec(thickness=2,circle_radius=1,color=[66,77,229])
  25. img=cv.imread("face.jpg")
  26. # 将图像模型输入,获取预测结果
  27. # BGR转RGB
  28. img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
  29. scaler=1
  30. h,w=img.shape[0],img.shape[1]
  31. # 将RGB图像输入模型,获取预测结果
  32. r=10
  33. results=model.process(img_RGB)
  34. # # 预测人人脸个数
  35. # 连轮廓最左侧点
  36. FL=results.multi_face_landmarks[0].landmark[234];
  37. FL_X,FL_Y=int(FL.x*w),int(FL.y*h);FL_Color=(234,0,255)
  38. img=cv.circle(img,(FL_X,FL_Y),r,FL_Color,-1)
  39. # 脸上侧边缘
  40. FT=results.multi_face_landmarks[0].landmark[10];#  10 坐标为上图中标注的点的序号
  41. FT_X,FT_Y=int(FT.x*w),int(FT.y*h);FT_Color=(231,141,181)
  42. img=cv.circle(img,(FT_X,FT_Y),r,FT_Color,-1)
  43. # 下侧边缘
  44. FB=results.multi_face_landmarks[0].landmark[152];#  152 坐标为上图中标注的点的序号
  45. FB_X,FB_Y=int(FB.x*w),int(FB.y*h);FB_Color=(231,141,181)
  46. img=cv.circle(img,(FB_X,FB_Y),r,FB_Color,-1)
  47. # 右侧
  48. FR=results.multi_face_landmarks[0].landmark[454];#  454 坐标为上图中标注的点的序号
  49. FR_X,FR_Y=int(FR.x*w),int(FR.y*h);FR_Color=(0,255,0)
  50. img=cv.circle(img,(FR_X,FR_Y),r,FR_Color,-1)
  51. # 左眼左眼角
  52. ELL=results.multi_face_landmarks[0].landmark[33];#  33坐标为上图中标注的点的序号
  53. ELL_X,ELL_Y=int(ELL.x*w),int(ELL.y*h);ELL_Color=(0,255,0)
  54. img=cv.circle(img,(ELL_X,ELL_Y),r,ELL_Color,-1)
  55. #左眼右眼角
  56. ELR=results.multi_face_landmarks[0].landmark[133];#  133坐标为上图中标注的点的序号
  57. ELR_X,ELR_Y=int(ELR.x*w),int(ELR.y*h);ELR_Color=(0,255,0)
  58. img=cv.circle(img,(ELR_X,ELR_Y),r,ELR_Color,-1)
  59. # 右眼左眼角362
  60. ERL=results.multi_face_landmarks[0].landmark[362];#  133坐标为上图中标注的点的序号
  61. ERL_X,ERL_Y=int(ERL.x*w),int(ERL.y*h);ERL_Color=(233,255,128)
  62. img=cv.circle(img,(ERL_X,ERL_Y),r,ERL_Color,-1)
  63. # 右眼右眼角263
  64. ERR=results.multi_face_landmarks[0].landmark[263];#  133坐标为上图中标注的点的序号
  65. ERR_X,ERR_Y=int(ERR.x*w),int(ERR.y*h);ERR_Color=(23,255,128)
  66. img=cv.circle(img,(ERR_X,ERR_Y),r,ERR_Color,-1)
  67. # 从左往右六个点的横坐标
  68. Six_X=np.array([FL_X,ELL_X,ELR_X,ERL_X,ERR_X,FR_X])
  69. # 从最左到最右的距离
  70. Left_Right=FR_X-FL_X
  71. # 从左向右六个点的间隔的五个距离一并划归
  72. Five_Distance=100*np.diff(Six_X)/Left_Right
  73. # 两眼宽度的平均值
  74. Eye_Width_Mean=np.mean((Five_Distance[1],Five_Distance[3]))
  75. # 五个距离分别与两眼宽度均值的差
  76. Five_Eye_Diff=Five_Distance-Eye_Width_Mean
  77. # 求L2范数,作为颜值的指标
  78. Five_Eye_Metrics=np.linalg.norm(Five_Eye_Diff)
  79. cv.line(img,(FL_X,FT_Y),(FL_X,FB_Y),FL_Color,3)
  80. cv.line(img,(ELL_X,FT_Y),(ELL_X,FB_Y),ELL_Color,3)
  81. cv.line(img,(ELR_X,FT_Y),(ELR_X,FB_Y),ELR_Color,3)
  82. cv.line(img,(ERL_X,FT_Y),(ERL_X,FB_Y),ERL_Color,3)
  83. cv.line(img,(ERR_X,FT_Y),(ERR_X,FB_Y),ERR_Color,3)
  84. cv.line(img,(FR_X,FT_Y),(FR_X,FB_Y),FR_Color,3)
  85. cv.line(img,(FL_X,FT_Y),(FR_X,FT_Y),FT_Color,3)
  86. cv.line(img,(FL_X,FB_Y),(FR_X,FB_Y),FB_Color,3)
  87. scaler=1
  88. img = cv.putText(img, 'Five Eye Metrics{:.2f}'.format(Five_Eye_Metrics), (25, 50), cv.FONT_HERSHEY_SIMPLEX, 1,(218, 112, 214), 4, 6)
  89. #img = cv.putText(img, 'Distance 1{:.2f}'.format(Five_Eye_Diff[0]), (25, 100), cv.FONT_HERSHEY_SIMPLEX, 1,(218, 112, 214), 5, 5)
  90. #img = cv.putText(img, 'Distance 1{:.2f}'.format(Five_Eye_Diff[2]), (25, 150), cv.FONT_HERSHEY_SIMPLEX, 1,(218, 112, 214), 4, 4)
  91. #img = cv.putText(img, 'Distance 1{:.2f}'.format(Five_Eye_Diff[4]), (25, 200), cv.FONT_HERSHEY_SIMPLEX,1,(218, 112, 214), 3, 4)
  92. look_img(img)
  93. cv.imwrite("yanzhi.jpg",img)
复制代码


【行空板】“三庭五眼”测测你的美貌图2
【行空板】“三庭五眼”测测你的美貌图4

【行空板】
【行空板】“三庭五眼”测测你的美貌图5


【行空板】“三庭五眼”测测你的美貌图7
【实时摄像头】
  1. import cv2 as cv
  2. import  mediapipe as mp
  3. import numpy as np
  4. import time
  5. import  matplotlib.pyplot as plt
  6. # 定义可视化图像函数
  7. def look_img(img):
  8.     img_RGB=cv.cvtColor(img,cv.COLOR_BGR2RGB)
  9.     plt.imshow(img_RGB)
  10.     plt.show()
  11. # 导入三维人脸关键点检测模型
  12. mp_face_mesh=mp.solutions.face_mesh
  13. # help(mp_face_mesh.FaceMesh)
  14. model=mp_face_mesh.FaceMesh(
  15.     static_image_mode=False,#TRUE:静态图片/False:摄像头实时读取
  16.    
  17.     max_num_faces=5,
  18.     min_detection_confidence=0.5, #置信度阈值,越接近1越准
  19.     min_tracking_confidence=0.5,#追踪阈值
  20. )
  21. # 导入可视化函数和可视化样式
  22. mp_drawing=mp.solutions.drawing_utils
  23. # mp_drawing_styles=mp.solutions.drawing_styles
  24. draw_spec=mp_drawing.DrawingSpec(thickness=2,circle_radius=1,color=[66,77,229])
  25. landmark_drawing_spec=mp_drawing.DrawingSpec(thickness=1,circle_radius=2,color=[66,77,229])
  26. # 轮廓可视化
  27. connection_drawing_spec=mp_drawing.DrawingSpec(thickness=2,circle_radius=1,color=[233,155,6])
  28. # 处理帧函数
  29. def process_frame(img):
  30.     start_time = time.time()
  31.     scaler = 1
  32.     h, w = img.shape[0], img.shape[1]
  33.     img_RGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)
  34.     results = model.process(img_RGB)
  35.     if results.multi_face_landmarks:
  36.         # for face_landmarks in results.multi_face_landmarks:
  37.             # 连轮廓最左侧点
  38.             FL = results.multi_face_landmarks[0].landmark[234];
  39.             FL_X, FL_Y = int(FL.x * w), int(FL.y * h);
  40.             FL_Color = (234, 0, 255)
  41.             img = cv.circle(img, (FL_X, FL_Y), 5, FL_Color, -1)
  42.             # 左眼左眼角
  43.             ELL = results.multi_face_landmarks[0].landmark[33];  # 33坐标为上图中标注的点的序号
  44.             ELL_X, ELL_Y = int(ELL.x * w), int(ELL.y * h);
  45.             ELL_Color = (0, 255, 0)
  46.             img = cv.circle(img, (ELL_X, ELL_Y), 5, ELL_Color, -1)
  47.            
  48.             # 左眼右眼角
  49.             ELR = results.multi_face_landmarks[0].landmark[133];  # 133坐标为上图中标注的点的序号
  50.             ELR_X, ELR_Y = int(ELR.x * w), int(ELR.y * h);
  51.             ELR_Color = (0, 255, 0)
  52.             img = cv.circle(img, (ELR_X, ELR_Y), 5, ELR_Color, -1)
  53.          
  54.             # 右眼左眼角362
  55.             ERL = results.multi_face_landmarks[0].landmark[362];  # 133坐标为上图中标注的点的序号
  56.             ERL_X, ERL_Y = int(ERL.x * w), int(ERL.y * h);
  57.             ERL_Color = (233, 255, 128)
  58.             img = cv.circle(img, (ERL_X, ERL_Y), 5, ERL_Color, -1)
  59.            
  60.             # 右眼右眼角263
  61.             ERR = results.multi_face_landmarks[0].landmark[263];  # 133坐标为上图中标注的点的序号
  62.             ERR_X, ERR_Y = int(ERR.x * w), int(ERR.y * h);
  63.             ERR_Color = (23, 255, 128)
  64.             img = cv.circle(img, (ERR_X, ERR_Y), 5, ERR_Color, -1)
  65.          
  66.             # 轮廓最右侧
  67.             FR = results.multi_face_landmarks[0].landmark[454];  # 454 坐标为上图中标注的点的序号
  68.             FR_X, FR_Y = int(FR.x * w), int(FR.y * h);
  69.             FR_Color = (0, 255, 0)
  70.             img = cv.circle(img, (FR_X, FR_Y), 5, FR_Color, -1)
  71.                        
  72.             # 脸上侧边缘
  73.             FT = results.multi_face_landmarks[0].landmark[10];  # 10 坐标为上图中标注的点的序号
  74.             FT_X, FT_Y = int(FT.x * w), int(FT.y * h);
  75.             FT_Color = (231, 141, 181)
  76.             img = cv.circle(img, (FT_X, FT_Y), 5, FT_Color, -1)
  77.             # 脸下侧边缘
  78.             FB = results.multi_face_landmarks[0].landmark[152];  # 152 坐标为上图中标注的点的序号
  79.             FB_X, FB_Y = int(FB.x * w), int(FB.y * h);
  80.             FB_Color = (231, 141, 181)
  81.             img = cv.circle(img, (FB_X, FB_Y), 5, FB_Color, -1)
  82.             
  83.             # 从左往右六个点的横坐标
  84.             Six_X = np.array([FL_X, ELL_X, ELR_X, ERL_X, ERR_X, FR_X])
  85.             # 从最左到最右的距离
  86.             Left_Right = FR_X - FL_X
  87.             # 从左向右六个点的间隔的五个距离一并划归
  88.             Five_Distance = 100 * np.diff(Six_X) / Left_Right
  89.             # 两眼宽度的平均值
  90.             Eye_Width_Mean = np.mean((Five_Distance[1], Five_Distance[3]))
  91.             # 五个距离分别与两眼宽度均值的差
  92.             Five_Eye_Diff = Five_Distance - Eye_Width_Mean
  93.             # 求L2范数,作为颜值的指标
  94.             Five_Eye_Metrics = np.linalg.norm(Five_Eye_Diff)
  95.             cv.line(img, (FL_X, FT_Y), (FL_X, FB_Y), FL_Color, 3)
  96.             cv.line(img, (ELL_X, FT_Y), (ELL_X, FB_Y), ELL_Color, 3)
  97.             cv.line(img, (ELR_X, FT_Y), (ELR_X, FB_Y), ELR_Color, 3)
  98.             cv.line(img, (ERL_X, FT_Y), (ERL_X, FB_Y), ERL_Color, 3)
  99.             cv.line(img, (ERR_X, FT_Y), (ERR_X, FB_Y), ERR_Color, 3)
  100.             cv.line(img, (FR_X, FT_Y), (FR_X, FB_Y), FR_Color, 3)
  101.             cv.line(img, (FL_X, FT_Y), (FR_X, FT_Y), FT_Color, 3)
  102.             cv.line(img, (FL_X, FB_Y), (FR_X, FB_Y), FB_Color, 3)
  103.             scaler = 1
  104.             #五眼指标
  105.             img = cv.putText(img, 'Five Eye Metrics{:.2f}'.format(Five_Eye_Metrics), (25, 50), cv.FONT_HERSHEY_SIMPLEX,
  106.                              1,
  107.                              (218, 112, 214), 2, 6)
  108.             img = cv.putText(img, 'Distance 1{:.2f}'.format(Five_Eye_Diff[0]), (25, 100), cv.FONT_HERSHEY_SIMPLEX, 1,
  109.                              (218, 112, 214), 2, 5)
  110.             img = cv.putText(img, 'Distance 1{:.2f}'.format(Five_Eye_Diff[2]), (25, 150), cv.FONT_HERSHEY_SIMPLEX, 1,
  111.                              (218, 112, 214), 2, 4)
  112.             img = cv.putText(img, 'Distance 1{:.2f}'.format(Five_Eye_Diff[4]), (25, 200), cv.FONT_HERSHEY_SIMPLEX, 1,
  113.                              (218, 112, 214), 2, 4)
  114.     else:
  115.         img = cv.putText(img, 'NO FACE DELECTED', (25, 50), cv.FONT_HERSHEY_SIMPLEX, 1.25,
  116.                          (218, 112, 214), 1, 8)
  117.     # 记录该帧处理完毕的时间
  118.     end_time = time.time()
  119.     # 计算每秒处理图像的帧数FPS
  120.     FPS = 1 / (end_time - start_time)
  121.     scaler = 1
  122.     img = cv.putText(img, 'FPS' + str(int(FPS)), (25 * scaler, 300 * scaler), cv.FONT_HERSHEY_SIMPLEX,
  123.                          1.25 * scaler, (0, 0, 255), 1, 8)
  124.     return img
  125. # 调用摄像头
  126. cap=cv.VideoCapture(0)
  127. cap.set(cv.CAP_PROP_FRAME_WIDTH, 320)
  128. cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240)
  129. cap.set(cv.CAP_PROP_BUFFERSIZE, 1)
  130. cv.namedWindow('my_window',cv.WND_PROP_FULLSCREEN)    #Set the windows to be full screen.
  131. cv.setWindowProperty('my_window', cv.WND_PROP_FULLSCREEN, cv.WINDOW_FULLSCREEN)    #Set the windows to be full screen.
  132. cap.open(0)
  133. # 无限循环,直到break被触发
  134. while cap.isOpened():
  135.     success,frame=cap.read()
  136.     # if not success:
  137.     #     print('ERROR')
  138.     #     break
  139.     frame=process_frame(frame)
  140.     #展示处理后的三通道图像
  141.     cv.imshow('my_window',frame)
  142.     if cv.waitKey(1) &0xff==ord('q'):
  143.         break
  144. cap.release()
  145. cv.destroyAllWindows()
复制代码


【行空板】“三庭五眼”测测你的美貌图3
【行空板】“三庭五眼”测测你的美貌图6


【演示视频】



ASH腻  管理员

发表于 2022-5-27 17:53:14

哈哈哈测出来怎么个水平
回复

使用道具 举报

少东  高级技师

发表于 2023-9-8 15:30:20

给医美提供了数据量化标准
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail