Image processing 精确肤色HSV范围

Image processing 精确肤色HSV范围,image-processing,opencv,computer-vision,skin,hsv,Image Processing,Opencv,Computer Vision,Skin,Hsv,我已经看到了关于皮肤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, hs

我已经看到了关于皮肤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&20150255,0}是它甚至可以检测到红色,当你将手放在红色背景中时,它不会跟踪你的皮肤…

请帮忙

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

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

基本上,它们可以检测人脸(oepncv很容易)。然后,他们提取人脸的肤色(这对于图像上的人来说非常特殊)。然后他们用这种颜色检测皮肤。由于颜色非常特殊,因此与固定颜色范围相比,它们的错误检测应该少得多。

根据这一点:

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

对于图像中非常暗的部分,您必须格外小心,可能会将它们全部丢弃,因为对于较小的V值,HSV转换会变得非常嘈杂


根据你的约束条件,你也可以考虑使用彩色手套(一些颜色在场景中不正常出现),或者设置不同颜色的背景,比红色更远离肤色(品红、绿色等等)。


请参阅samples/c/adaptiveskindetector_sample.cpp

,如果您使用视频字幕,您应该注意,在大多数情况下,摄像头会自动调整对比度,这会对图像产生影响,因为您的色调会有显著差异,你也应该考虑影响皮肤的阴影和光源

我知道现在回答这个问题已经太晚了。但我也在做同样的事情,我用K表示聚类来获得肤色。那就是首先你必须检测人脸,这是我用Haar cascade分类器做的,然后根据人脸的坐标你可以裁剪人脸,然后用它作为聚类颜色的源。找出包含最多元素的簇,这将是您的肤色。或者,在不指定某个特定值的情况下,可以获得簇中心点,并通过扣除和添加特定值将其用作范围。 这将很有帮助

我已经试过了
lower=np.array([0,10,60],dtype=“uint8”)
upper=np.array([20150255],dtype=“uint8”)

它提供了几乎不错的结果。

在代码中尝试以下预处理功能:

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

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

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

他使用:

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

他对Github的反应相当积极,所以一个选择是联系他,询问他是如何得出这些数字的

非洲裔美国人呢(如果这个词再合适的话)?还是印第安人?还是印度人?还是澳大利亚土著?还是小绿人?我说的是一般性的…应该是针对人类皮肤的…如果是这样的话,请给我不同的范围…我认为我们可以使用cvInRangeS用于多个范围…这就是你的问题所在。既然你只对人类感兴趣(我想你不会赞同一些奇怪的种族主义哲学,认为其他种族是非人的),我们只能把那些小绿人算出来。这仍然留下了大量的颜色范围,以满足。现在我假设这是对照片或视频(告诉皮肤和其他东西之间的区别)做一些事情,因此,除非你的照片被标记为只包含高加索人、土著人或其他什么,否则能够分辨人类和非人类之间的区别的机会很小。即使有多个范围。如果有更多的限制,或者我认为你的实际需要是错误的,这可能是可行的。在这种情况下,让我们知道。@paxdiablo我想跟踪手…基本上是手表的AR…在这种情况下,用户将手放在手的模板图像中,我们得到手腕与数字的距离。我们能做的更多的是让用户点击特定位置并获得hsv值…请帮助我…阅读您的评论并喜欢这个想法…因为我正在尝试做的是…让我查看您提供的链接…非常感谢您的回答…您是如何得出下限和上限的?你能看看我下面的答案,告诉我你对深度凝视边界的看法吗?我想知道你是在使用Mat还是IplImage,因为OpenCV将颜色输入BGR而不是RGB,所以hsv应该是hsv=cv2.CVT颜色(模糊,CV_BGR2HSV)。为什么饱和度和值为255?这些也将检测非常饱和的颜色。皮肤通常不是鲜红的。链接是死的,但似乎是同一篇文章。