2015-09-08 11 views
2

Я новичок в компьютерном видении. Я делаю детектор кожи на Android, основанный на http://www.pyimagesearch.com/2014/08/18/skin-detection-step-step-example-using-python-opencv/Какое цветовое пространство для датчика HSV Skin 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; 
} 

Update 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, isS ubmat = ложь, nativeObj = 0xffffffffb8b15698, dataAddr = 0xffffffffb984e030]
V: Mat [261 * 261 * CV_8UC1, isCont = истина, isSubmat = ложь, nativeObj = 0xffffffffb8b156d8, dataAddr = 0xffffffffb985ea60]

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

+0

не уверен, андроид, но, как правило OpenCV изображения Арент RGB, но BGR так что, возможно попробовать преобразование BGRA2RGB до RGB2HSV – Micka

+1

@Micka: в Adnroid использования RGBA – tanbaobu

+0

затем образец выглядит нормально ... В чем разница между '' COLOR_RGB2HSV' и COLOR_RGB2HSV_FULL '? Возможно, попробуйте без эрозии, расширения и гаусса в первых попытках. И, возможно, попробуйте более широкий диапазон в начале, например «Скаляр ниже = новый Scalar (0, 0, 0); Scalar upper = new Scalar (25, 255, 255); ' – Micka

ответ

1

Эти диапазоны цвета HSV должны быть в порядке для обнаружения кожи.

Я использовал этот образ для тестирования: http://www.dance-classes.ca/photos/faces/faces_2004W_comp1.jpg enter image description here

найдены на https://fashionisrael.wordpress.com/2010/03/08/fashion-battle-royale-castro-vs-hm/

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

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

enter image description here

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

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

+0

ty, я могу сделать это, но это не моя надежда. Я думаю, что это должно быть лучше. Возможно, я пропустил несколько шагов. – tanbaobu

+0

Имейте в виду, что цвет изображения также зависит от воздействия окружающей среды. попробуйте «нормализовать» ваши изображения, например. баланс белого, выравнивание гистограммы и т. д. – Micka

+0

благодарит вас за ваши советы – tanbaobu

 Смежные вопросы

  • Нет связанных вопросов^_^