OpenCV颜色转换和皮肤检测(2)

// split the 3 channels into 3 images
    std::vector<cv::Mat> channels;
    cv::split(hsv, channels);
    // channels[0] is the Hue
    // channels[1] is the Saturation
    // channels[2] is the Value

// Hue masking
    cv::Mat mask1; // below maxHue
    cv::threshold(channels[0], mask1, maxHue, 255, cv::THRESH_BINARY_INV);
    cv::Mat mask2; // over minHue
    cv::threshold(channels[0], mask2, minHue, 255, cv::THRESH_BINARY);

cv::Mat hueMask; // hue mask
    if (minHue < maxHue)
        hueMask = mask1 & mask2;
    else // if interval crosses the zero-degree axis
        hueMask = mask1 | mask2;

// Saturation masking
    // below maxSat
    cv::threshold(channels[1], mask1, maxSat, 255, cv::THRESH_BINARY_INV);
    // over minSat
    cv::threshold(channels[1], mask2, minSat, 255, cv::THRESH_BINARY);

cv::Mat satMask; // saturation mask
    satMask = mask1 & mask2;

// combined mask
    mask = hueMask&satMask;
}

int main()
{
    // 读入图像
    cv::Mat image= cv::imread("girl.jpg");
    if (!image.data)
        return 0;
    // show original image
    cv::namedWindow("Original image");
    cv::imshow("Original image",image);
    // detect skin tone
    cv::Mat mask;
    detectHScolor(image,
              160, 10, // hue from 320 degrees to 20 degrees
              25, 166, // saturation from ~0.1 to 0.65
              mask);
// show masked image
    cv::Mat detected(image.size(), CV_8UC3, cv::Scalar(0, 0, 0));
    image.copyTo(detected, mask);
    cv::imshow("Detection result",detected);
    cv::waitKey();
}

实现效果

OpenCV颜色转换和皮肤检测

可改进的地方

在检测时没有考虑颜色的亮度。在实际应用中,排除较高亮度的颜色可以降低把明亮的淡红色误认为皮肤的可能性。所以要想对皮肤颜色进行可靠和准确的检测, 还需要更加精确的分析。对不同的图像进行检测,也很难保证效果都好,因为摄影时影响彩色再 现的因素有很多,如白平衡和光照条件等。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b7cffbece27c125dc4dceb4e6964df89.html