2015-04-18 20 views
5

Ich versuche, den Mund in einem Bild mit OpenCV zu erfassen, so dass ich mit dem folgenden Code:Erkennen Mund mit OpenCV

#include "face_detection.h" 

using namespace cv; 

// Function detectAndDisplay 
void detectAndDisplay(const std::string& file_name, cv::CascadeClassifier& face_cascade, cv::CascadeClassifier& mouth_cascade) 
{ 
    Mat frame = imread(file_name); 
    std::vector<Rect> faces; 
    Mat frame_gray; 
    Mat crop; 
    Mat res; 
    Mat gray; 

    cvtColor(frame, frame_gray, COLOR_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 

    // Detect faces 
    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); 

    for(unsigned int i=0;i<faces.size();i++) 
    { 
     rectangle(frame,faces[i],Scalar(255,0,0),1,8,0); 
     Mat face = frame(faces[i]); 
     cvtColor(face,face,CV_BGR2GRAY); 
     std::vector <Rect> mouthi; 
     mouth_cascade.detectMultiScale(face, mouthi); 
     for(unsigned int k=0;k<mouthi.size();k++) 
     { 
     Point pt1(mouthi[k].x+faces[i].x , mouthi[k].y+faces[i].y); 
     Point pt2(pt1.x+mouthi[k].width, pt1.y+mouthi[k].height); 
     rectangle(frame, pt1,pt2,Scalar(0,255,0),1,8,0); 
     } 

    } 

    imshow("Frame", frame); 
    waitKey(33); 
} 

Die Klassifizierer sind haarcascade_frontalface_alt.xml und haarcascade_mcs_mouth.xml.

Das Gesicht ist richtig erkannt, aber der Mund ist nicht: Ich bekomme auch die Augen und einige andere Teile, wie die Stirn. Gibt es eine Möglichkeit, nur den Mund zu erkennen?

Antwort

5

Ich denke, dass ich es geschafft habe, das Problem zu lösen: Fokussierung auf die untere Gesichtshälfte und Erhöhung des Skalierungsfaktors machten den Trick und jetzt kann ich den Mund mit einer guten Präzision erkennen. Jedenfalls scheint diese Aufgabe viel komplizierter zu sein als die Gesichtserkennung, auch wenn ich "einfache" Bilder verwende, also gerade und frontal.

Hier sind zwei Beispiele: ein Erfolg und ein Fehler.

ok wrong

+0

Hey, kann ich einen Link zu dem Datensatz bekommen, von dem Sie diese Bilder bekommen haben? Ich habe die Bilder bei mir, aber ich kann den Link zu der Seite nicht finden. Ich muss für Zitate. Vielen Dank! –

+0

@AninditKarmakar Hallo, es ist der KDEF-Datensatz: http://www.emotionlab.se/resources/kdef – minomic

+0

@minomic Können Sie auf das Thema schauen: http://stackoverflow.com/questions/37921913/java-and- Haarkascade-Gesicht-und-Mund-Erkennung-Mund-als-die-Nase – Adamo

0

I wurde vor dem gleiche Problem, so konzentrierte ich nur auf der unteren Hälfte des Gesichts und eine ROI aus dem erfassten Gesicht erstellt. Es sieht in etwa so aus:

Mat ROI=image(Rect(face.x,face.y+face.height*0.6,face.width,face.height*0.3)); 

Wo Gesicht ist das erkannte Gesicht aus dem Bild.

Dadurch wurde nur für die untere Hälfte ein ROI vom erkannten Gesicht erzeugt. Sonst hat der Mundmelder die Augen auch als Mund erkannt.

Dann verwenden Sie die MouthCascade.xml von diesem Link: http://alereimondo.no-ip.org/OpenCV/34 , die weit effizienter als die eingebaute OpenCV ist.