精确肤色HSV系列

Waz*_*azy 7 opencv skin image-processing hsv computer-vision

我已经看到所有关于皮肤的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);
Run Code Online (Sandbox Code Playgroud)

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

小智 8

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

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

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

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

  • 链接已死,但[this](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.573.9432&rep=rep1&type=pdf)似乎是同一篇文章。 (2认同)

Oli*_*Oli 7

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

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

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

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


小智 7

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


小智 5

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