一、总概
今天写了一篇基于深度学习的人脸检测,写完下午就开始实战第二篇,皮肤检测。原理很简单,就是基于HSV的阈值处理。为什么不用BGR阈值,因为HSV的颜色空间,更加直观,特别适用于颜色分割。具体可以参考博客,今天在调试HSV空间上浪费了很多时间,总是找不对范围。也试过色彩提取软件,但是没有效果,取出的范围和opencv还是有很大的出入,最终只能挑一个效果比较好的范围。
整体代码参考博客,但是题主的源代码并不适合,所以我做了修改,具体见以下代码。
二、代码
'''
皮肤检测:利用皮肤颜色的HSV范围,去掉其他的区域,实现皮肤检测
'''
import numpy as np
import argparse
import cv2
# 定义皮肤的范围,具体自己调整
lower = np.array([0, 50, 100], dtype = "uint8")
upper = np.array([25, 255, 255], dtype = "uint8")
camera = cv2.VideoCapture(0) # 开启摄像头
while True:
(grabbed, frame) = camera.read() #grabbed为布尔类型,true表示获取到帧数
frame = cv2.resize(frame, (400,400))
# 将BGR格式转为HSV颜色空间
# HSV在用于指定颜色分割时,有比较大的作用
hsvImage = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 创建掩码,q低于lower或高于upper的,设置为0,在范围内设置为255
# 这样便可以得到皮肤的像素范围
skinMask = cv2.inRange(hsvImage, lower, upper)
# 将掩码和原图进行“与”运算,这样原图便只保留皮肤区域
skin = cv2.bitwise_and(frame, frame, mask = skinMask)
# np.hstack是将原图和检测的图捆绑显示(将矩阵横向并行)
cv2.imshow("images", np.hstack([frame,hsvImage, skin]))
if cv2.waitKey(1) & 0xFF == ord("q"):
break
# 释放资源
camera.release()
cv2.destroyAllWindows()
里面的注释已经很详细,欢迎留言交流。这里我不用开闭运算和高斯滤波,因为觉得没什么效果,读者不防试一下。
三、效果
效果一般,有很多噪声点,但是总体的皮肤区域都出来了。
四、总结
基于颜色阈值的方法,我个人觉得不好用。因为受环境影响非常大,特别是光照,以及背景。除非背景比较单一,且稳定,否则一般不考虑这个方法。
欢迎一起学习交流,源代码也可以去github下载。
欢迎关注我的公众号【CV之道】,一起学习交流~~