OpenCV中的肤色检测

时间:2014-03-21 08:30:33

标签: c opencv

我尝试在Opencv中进行肤色检测。

1)首先我将图像从RGB转换为HSV

cvCvtColor(frame, hsv, CV_BGR2HSV);

2)比我在HSV图像中应用肤色阈值

cvInRangeS(hsv, hsv_min, hsv_max, mask); // hsv_min & hsv_max are the value for skin detection

3)因此它产生仅具有肤色但在黑色和黑色中的糊状物。白色图像,所以我将该图像转换为RGB

 cvCvtColor(mask, temp, CV_GRAY2RGB);

4)所以现在我想要肤色只有RGB值。

for(c = 0; c <  frame -> height; c++) {
            uchar* ptr = (uchar*) ((frame->imageData) + (c * frame->widthStep));
            uchar* ptr2 = (uchar*) ((temp->imageData) + (c * temp->widthStep));
            for(d = 0; d < frame -> width; d++) {
                if(ptr2[3*d+0] != 255 && ptr2[3*d+1] != 255 && ptr2[3*d+2] != 255 && ptr2[3*d+3] != 255 ){
                    ptr[3 * d + 0] = 0;
                    ptr[3 * d + 1] = 0;
                    ptr[3 * d + 2] = 0;
                    ptr[3 * d + 3] = 0;
                }   
            }
        }

现在我没有得到我想要的图像,只有RGB的肤色。

任何解决方案,

由于

enter image description here

第1张原始图片 黑色和第二个皮肤检测图像白色 第三输出(非实际)

2 个答案:

答案 0 :(得分:4)

你已经非常接近了。

给出,你已经有一个3通道掩码:

Mat mask, temp;
cv::cvtColor(mask, temp, CV_GRAY2RGB);

您需要做的就是将它与原始图像结合起来,以掩盖所有非肤色:

(不,不要在那里写[容易出错]循环,更好地依赖内置功能!)

Mat draw = frame & temp; // short for bitwise_and()

imshow("skin",draw);
waitKey();

答案 1 :(得分:2)

或者,无需将mask转换为RGB,您可以.copyTo()传递掩码参数

cv::cvtColor(inputFrame, hsv, CV_BGR2HSV);
cv::inRange(hsv, hsv_min, hsv_max, mask);

cv::Mat outputFrame;
inputFrame.copyTo(outputFrame, mask);