2016-06-20 24 views
14

Heute beginne ich das Projekt zu testen, das ein Lächeln in Java und OpenCv erkennt. Um Anerkennung Gesicht und Mund Projekt verwendet haarcascade_frontalface_alt und haarcascade_mcs_mouth Aber ich verstehe nicht, warum in einigen Gründen Projekt Nase als Mund erkennen. Ich habe zwei Methoden:Java und Haarkaskade Gesicht und Mund Erkennung - Mund als die Nase

private ArrayList<Mat> detectMouth(String filename) { 
    int i = 0; 
    ArrayList<Mat> mouths = new ArrayList<Mat>(); 
    // reading image in grayscale from the given path 
    image = Highgui.imread(filename, Highgui.CV_LOAD_IMAGE_GRAYSCALE); 
    MatOfRect faceDetections = new MatOfRect(); 
    // detecting face(s) on given image and saving them to MatofRect object 
    faceDetector.detectMultiScale(image, faceDetections); 
    System.out.println(String.format("Detected %s faces", faceDetections.toArray().length)); 
    MatOfRect mouthDetections = new MatOfRect(); 
    // detecting mouth(s) on given image and saving them to MatOfRect object 
    mouthDetector.detectMultiScale(image, mouthDetections); 
    System.out.println(String.format("Detected %s mouths", mouthDetections.toArray().length)); 
    for (Rect face : faceDetections.toArray()) { 
     Mat outFace = image.submat(face); 
     // saving cropped face to picture 
     Highgui.imwrite("face" + i + ".png", outFace); 
     for (Rect mouth : mouthDetections.toArray()) { 
      // trying to find right mouth 
      // if the mouth is in the lower 2/5 of the face 
      // and the lower edge of mouth is above of the face 
      // and the horizontal center of the mouth is the enter of the face 
      if (mouth.y > face.y + face.height * 3/5 && mouth.y + mouth.height < face.y + face.height 
        && Math.abs((mouth.x + mouth.width/2)) - (face.x + face.width/2) < face.width/10) { 
       Mat outMouth = image.submat(mouth); 
       // resizing mouth to the unified size of trainSize 
       Imgproc.resize(outMouth, outMouth, trainSize); 
       mouths.add(outMouth); 
       // saving mouth to picture 
       Highgui.imwrite("mouth" + i + ".png", outMouth); 
       i++; 
      } 
     } 
    } 
    return mouths; 
} 

und erfassen Lächeln

private void detectSmile(ArrayList<Mat> mouths) { 
     trainSVM(); 
     CvSVMParams params = new CvSVMParams(); 
     // set linear kernel (no mapping, regression is done in the original feature space) 
     params.set_kernel_type(CvSVM.LINEAR); 
    // train SVM with images in trainingImages, labels in trainingLabels, given params with empty samples 
     clasificador = new CvSVM(trainingImages, trainingLabels, new Mat(), new Mat(), params); 
     // save generated SVM to file, so we can see what it generated 
     clasificador.save("svm.xml"); 
     // loading previously saved file 
     clasificador.load("svm.xml"); 
     // returnin, if there aren't any samples 
     if (mouths.isEmpty()) { 
      System.out.println("No mouth detected"); 
      return; 
     } 
     for (Mat mouth : mouths) { 
      Mat out = new Mat(); 
      // converting to 32 bit floating point in gray scale 
      mouth.convertTo(out, CvType.CV_32FC1); 
      if (clasificador.predict(out.reshape(1, 1)) == 1.0) { 
       System.out.println("Detected happy face"); 
      } else { 
       System.out.println("Detected not a happy face"); 
      } 
     } 
    } 

Beispiele:

für das Bild

enter image description here

erkennt korrekt dieses mounth:

enter image description here

aber in anderen Bild

enter image description here

Nase erkannt wird enter image description here

Was ist das Problem Ihrer Meinung nach?

Antwort

10

Am wahrscheinlichsten erkennt es es falsch auf Ihrem Bild wegen des Verhältnisses des Gesichtes (zu langer Abstand von Augen zu Mund verglichen mit Abstand zwischen Augen). Erkennung von Mund und Nase mit Haar Detektor ist nicht sehr stabil, so Algorithmen in der Regel Geometrie-Modell des Gesichts zu verwenden, um die beste Kombination von Merkmalskandidaten für jedes Gesichtsmerkmal zu wählen. Einige Implementierungen können sogar versuchen, die Mundposition basierend auf Augen vorherzusagen, wenn keine Mundkandidaten gefunden wurden.

Haardetektor ist nicht der neueste und am besten bekannte zu dieser Zeit für Feature-Erkennung. Versuchen Sie, verformbare Teilemodellimplementierungen zu verwenden. Versuchen Sie dies, sie haben Matlab-Code mit effizienten C++ optimierte Funktionen: https://www.ics.uci.edu/~xzhu/face/