精确肤色HSV系列

image-processing opencv computer-vision skin hsv

33814 观看

8回复

7128 作者的声誉

我已经看到所有关于皮肤的HSV颜色空间范围的问题
但是我只能弄清楚这一点

代码 -

CvScalar  hsv_min = cvScalar(0, 30, 60, 0);
CvScalar  hsv_max = cvScalar(20, 150, 255, 0);
//range I am using is { 0,30,60,0 & 20,150,255,0 }
cvCvtColor(src, hsv_image, CV_BGR2HSV);
cvInRangeS (hsv_image, hsv_min, hsv_max, hsv_mask);
cvDilate(hsv_mask,hsv_mask,0,1);
cvErode(hsv_mask,hsv_mask,0,1);
cvSmooth( hsv_mask, hsv_mask, CV_MEDIAN);

此范围的问题 {0,30,60,0和20,150,255,0} 是否检测到红色,当您将手放在红色背景时,它不会跟踪您的皮肤...
请帮助!

作者: Wazy 的来源 发布者: 2012 年 1 月 6 日

回应 (8)


7

13245 作者的声誉

决定

基本上,皮肤很难有一个固定的颜色范围,因为即使你只想检测自己的皮肤,它的颜色实际上会根据光照条件发生很大变化。

所以,也许你可以使用2011年这篇不错的科学文章的想法:

http://www.robots.ox.ac.uk/~vgg/research/hands/

基本上,他们检测到脸部(用oepncv很容易)。然后,他们提取脸部的肤色(这是图像上的人非常特定)。然后他们用这种颜色检测皮肤。由于颜色非常具体,因此与固定颜色范围相比,它们的错误检测要少得多。

作者: Oli 发布者: 06.01.2012 10:55

8

463 作者的声誉

根据这个:http//matmidia.org/sibgrapi2009/media/posters/59928.pdf

通道H中的皮肤的特征在于0到50之间的值,在通道S中,亚洲和高加索人种的皮肤从0.23到0.68。

你必须特别注意图像中非常暗的部分并且可能完全丢弃它们,因为对于小的V值,HSV转换会变得非常嘈杂。

根据您的约束条件,您还可以考虑使用彩色手套(某些颜色在场景中没有正常显示),或设置不同于红色的背景,即远离肤色(洋红色,绿色,随你)。

作者: Leonidas K 发布者: 06.01.2012 11:22

3

1018 作者的声誉

OpenCv上存在自适应皮肤检测器,参见samples / c / adaptiveskindetector_sample.cpp

作者: Birol Kuyumcu 发布者: 22.01.2012 08:42

1

241 作者的声誉

如果你正在使用视频标题,你应该担心在大多数情况下摄像机会自动进行对比度调整,这会对你的图像产生影响,因为你会有明显的色调差异,你也应该考虑阴影和影响皮肤的光源

作者: Alexander Leon VI 发布者: 13.04.2015 03:55

5

65 作者的声誉

我知道回复这个为时已晚。但我也这样做,我用K意味着聚类来获得肤色。首先你必须检测面部,我正在使用Haar级联分类器,然后根据面部的坐标你可以裁剪面部,然后使用它作为聚类颜色的源。找出具有最多元素且将是您的肤色的群集。或者,如果没有指定一个特定值,您可以获得群集中心点,并且可以通过扣除和添加特定值将其用作范围。这将是有用的http://answers.opencv.org/question/23196/k-mean-clustering-of-hsv-histogram-of-frames-of-a-video/

作者: nickY 发布者: 03.12.2015 04:57

2

303 作者的声誉

我试过
lower = np.array([0, 10, 60], dtype = "uint8") upper = np.array([20, 150, 255], dtype = "uint8") 它给了几乎好的结果。

作者: Mayank Kumar 发布者: 19.03.2017 09:56

2

58 作者的声誉

在代码中尝试这个预处理功能:

def preprocess(action_frame):

    blur = cv2.GaussianBlur(action_frame, (3,3), 0)
    hsv = cv2.cvtColor(blur, cv2.COLOR_RGB2HSV)

    lower_color = np.array([108, 23, 82])
    upper_color = np.array([179, 255, 255])

    mask = cv2.inRange(hsv, lower_color, upper_color)
    blur = cv2.medianBlur(mask, 5)

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (8, 8))
    hsv_d = cv2.dilate(blur, kernel)

return hsv_d

我已经使用了好几个月了。它可能会永远解决您的问题。

作者: Ashish Gupta 发布者: 21.01.2019 12:47

0

108 作者的声誉

Deepgaze是一个除了其他功能外还具有皮肤检测功能的库。

DeepGaze Github

他用:

[0, 58, 50] lower bound skin HSV
[30, 255, 255] upper bound skin HSV

他对Github非常敏感,所以可以选择与他联系并询问他是如何得出这些数字的。

作者: mLstudent33 发布者: 25.08.2019 04:20
32x32