创作灵感
根据电商平台的发展趋势和需要,我提出了一个在线肤色识别工具的创意。这个工具可以帮助消费者在选择化妆品时更准确地根据自己的肤色选择适合的产品。
接下来代码部分(写的有点简陋):
tkinter界面:
分别写了三个按钮 对应:图片识别,实时识别,视频识别
# 添加按钮
button1 = tk.Button(window, text='选取图片', command=open_image_file)
button1.pack()
button2 = tk.Button(window, text='实时摄像头识别', command=lambda: start_recognition(0))
button2.pack()
button3 = tk.Button(window, text='选取视频', command=open_video_file)
button3.pack()
Haar 级联检测器:
本文使用的是opencv中的Haar 级联检测器来检测人脸
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faceRects = faceCascade.detectMultiScale(gray, 1.1, 5)
后将人脸部分提取出来进行肤色识别
for (x, y, w, h) in faceRects:
roi_color = frame[y:y + h, x:x + w] # 获取人脸区域图像
肤色识别:
将识别到的人脸
-
颜色空间转换:
- 利用 OpenCV 中的
cv2.cvtColor()
函数将感兴趣区域(roi_color
)的颜色空间从 BGR 转换为 HSV。
- 利用 OpenCV 中的
-
皮肤颜色提取:
- 通过设定预定义的皮肤颜色范围(在 HSV 颜色空间中),使用
cv2.inRange()
函数创建一个掩码(mask
),用于过滤出图像中符合皮肤颜色范围的像素。
- 通过设定预定义的皮肤颜色范围(在 HSV 颜色空间中),使用
-
皮肤区域提取:
- 使用
cv2.bitwise_and()
函数将原始图像的感兴趣区域与皮肤掩码进行按位与操作,得到包含皮肤区域的图像(skin
)。
- 使用
hsv = cv2.cvtColor(roi_color, cv2.COLOR_BGR2HSV)
lower_skin = np.array([0, 20, 70], dtype=np.uint8)
upper_skin = np.array([20, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower_skin, upper_skin)
skin = cv2.bitwise_and(roi_color, roi_color, mask=mask)
计算皮肤区域的白色像素占比: 计算图像中感兴趣区域内皮肤区域的白色像素所占的比例。通过这一比例,我们可以了解皮肤区域在整个感兴趣区域中的相对大小。这对于人脸检测、肤色分析以及图像处理等任务非常有用
white_pixels = np.sum(mask == 255)
total_pixels = mask.shape[0] * mask.shape[1]
white_ratio = white_pixels / total_pixels
白色像素占皮肤区域的比例 white_ratio
,判断出不同肤色类型,并将其分为不同的类别
# 根据白色像素占比判断肤色
if white_ratio > 0.9:
skin_color = '冷白皮:使用(#00)'
elif white_ratio > 0.86:
skin_color = '粉一白:使用(p01)'
elif white_ratio > 0.83:
skin_color = '粉二白:使用(p02)'
elif white_ratio > 0.78:
skin_color = '黄一白:使用(w01)'
elif white_ratio > 0.75:
skin_color = '黄二白:使用(w02)'
elif white_ratio > 0.73:
skin_color = '黄黑皮'
else:
skin_color = '黑皮'