Какое цветовое пространство для детектора кожи HSV openCV android?

Я новичок в компьютерном зрении. Я делаю детектор кожи на Android на основе http://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/

Но у меня проблема с выбором цветового пространства. http://imgur.com/DxNOXd9 (Сэр, я не могу опубликовать изображение без 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: Mat [ 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]

Как я могу применить их к своему коду?


person tanbaobu    schedule 08.09.2015    source источник
comment
не уверен насчет Android, но обычно изображения openCV не RGB, а BGR, поэтому, возможно, попробуйте преобразование BGRA2RGB перед RGB2HSV   -  person Micka    schedule 08.09.2015
comment
@Micka: в adnroid используйте rgba   -  person tanbaobu    schedule 08.09.2015
comment
тогда образец выглядит нормально... какая разница между COLOR_RGB2HSV и COLOR_RGB2HSV_FULL? Может быть, попробовать без эрозии, расширения и Гаусса в первых попытках. И, возможно, сначала попробуйте увеличить диапазон, например Scalar lower = new Scalar(0, 0, 0); Scalar upper = new Scalar(25, 255, 255);.   -  person Micka    schedule 08.09.2015


Ответы (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/

и этот код (С++ сокращен до преобразования 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;
}

давая мне этот результат:

введите здесь описание изображения

Что нормально для простого детектора кожи.

Можете ли вы проверить результат для этого тестового изображения с помощью своего кода?

person Micka    schedule 08.09.2015
comment
ty, я могу сделать это, но это не моя надежда. Я думаю, что они должны быть лучше. Возможно, я пропустил какие-то шаги. - person tanbaobu; 08.09.2015
comment
имейте в виду, что цвет изображения также зависит от воздействия окружающей среды. попробуйте нормализовать ваши изображения, например. баланс белого, выравнивание гистограммы и т. д. - person Micka; 08.09.2015