【问题标题】:Which is color space for HSV Skin detector openCV android?哪个是 HSV 皮肤检测器 openCV android 的颜色空间?
【发布时间】:2015-12-03 14:22:18
【问题描述】:

我是计算机视觉方面的新手。 我基于http://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/在Android上做了一个皮肤检测器

但是我在选择色彩空间时遇到了问题。 http://imgur.com/DxNOXd9(Sr,没有 10 个声望我不能发布图片)

我在互联网和这个网站上尝试了很多空间,但都错了。
这是我的代码:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {    
    Mat hsv = new Mat();
    //H,S,V area
    Scalar lower = new Scalar(0, 0.28*255, 0);
    Scalar upper = new Scalar(25, 0.68*255, 255);
    //Skin detector HSV-based
    Imgproc.cvtColor(inputFrame.rgba(), hsv, Imgproc.COLOR_RGBA2RGB);
    Imgproc.cvtColor(hsv, hsv, Imgproc.COLOR_RGB2HSV_FULL);
    Mat result = new Mat(hsv.rows(), hsv.cols(), CvType.CV_8U);
    Core.inRange(hsv, lower, upper, result);
    // Perform and decrease noise
    Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(2, 2));
    Imgproc.erode(result, result, kernel);
    Imgproc.dilate(result, result, kernel);
    Imgproc.GaussianBlur(result, result, new Size(3,3), 0);
    // Output
    Imgproc.cvtColor(result, result, Imgproc.COLOR_GRAY2RGB);
    Imgproc.cvtColor(result, result, Imgproc.COLOR_RGB2RGBA);
    return result;
}

更新 1: 我尝试通过人脸检测示例获取皮肤空间:

        for (int i = 0; i < facesArray.length; i++) {
        Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(),
                FACE_RECT_COLOR, 3);        
        Mat hsv = new Mat(inputFrame.rgba(), facesArray[i]);
        Imgproc.cvtColor(hsv, hsv, Imgproc.COLOR_RGB2HSV_FULL);
        List<Mat> hsv_channel = new ArrayList<Mat>();
        Core.split(hsv, hsv_channel);
        Log.w("Color: ", "H: " + hsv_channel.get(0) + "S: " + hsv_channel.get(1) + "V: " + hsv_channel.get(2));
    }

然后输出:
H:垫 [261*261*CV_8UC1,isCont=true,isSubmat=false,nativeObj=0xffffffffb8b15658,dataAddr=0xffffffffb983d5f0]
S: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b15698, dataAddr=0xffffffffb984e030 ]
V: Mat [ 261*261*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0xffffffffb8b156d8, dataAddr=0xffffffffb985ea60 ]

如何将这些应用到我的代码中?

【问题讨论】:

  • 不确定android,但通常openCV图像不是RGB而是BGR,所以也许在RGB2HSV之前尝试BGRA2RGB转换
  • @Micka:在adnroid中使用rgba
  • 那么样本看起来没问题...COLOR_RGB2HSVCOLOR_RGB2HSV_FULL 有什么区别?也许在第一次尝试时不要尝试腐蚀、膨胀和高斯。并且可能在开始时尝试更大的范围,例如Scalar lower = new Scalar(0, 0, 0); Scalar upper = new Scalar(25, 255, 255);

标签: android opencv computer-vision hsv vision


【解决方案1】:

这些 HSV 颜色范围应该可以用于皮肤检测。

我已使用此图像进行测试: http://www.dance-classes.ca/photos/faces/faces_2004W_comp1.jpg

发现于https://fashionisrael.wordpress.com/2010/03/08/fashion-battle-royale-castro-vs-hm/

还有这段代码(C++ 简化为 hsv 转换和 inRange 测试:

int main()
{
    cv::Mat input = cv::imread("../inputData/faces2.jpg");

    cv::Mat hsv;
    cv::cvtColor(input,hsv,CV_BGR2HSV);

    double scaleSatLower = 0.28;
    double scaleSatUpper = 0.68;
    //double scaleSatLower = 0.18; // maybe better
    //double scaleSatLower = 0.08; // maybe too much
    //double scaleSatUpper = 0.78;
    cv::Scalar lower = cv::Scalar(0, scaleSatLower*255, 0);
    cv::Scalar upper = cv::Scalar(25, scaleSatUpper*255, 255);

    cv::Mat result;
    cv::inRange(hsv, lower, upper, result);
    cv::imshow("result", result);


    cv::imshow("input",input);
    cv::imwrite("../outputData/HSV_skin.png", result);
    cv::waitKey(0);
    return 0;
}

给我这个结果:

这对于简单的皮肤检测器来说是可以的。

你能用你的代码验证这个测试图像的结果吗?

【讨论】:

  • ty,我可以做这些,但那些不是我的希望。我认为那些应该更好。也许我错过了一些步骤。
  • 请记住,图像颜色还取决于环境影响。尝试“标准化”您的图像,例如白平衡、直方图均衡等
猜你喜欢
  • 2011-12-19
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2013-06-03
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多