2015-04-18 13 views
5

Sto cercando di rilevare la bocca in un'immagine con OpenCV, così io sto usando il seguente codice:bocca Rilevare con 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); 
} 

I classificatori sono haarcascade_frontalface_alt.xml e haarcascade_mcs_mouth.xml.

Il viso viene rilevato correttamente ma la bocca non lo è: ottengo anche gli occhi e alcune altre parti, come la fronte. C'è un modo per rilevare solo la bocca?

risposta

5

Penso di essere riuscito a risolvere il problema: concentrarsi sulla metà inferiore del viso e aumentare il fattore di scala ha fatto il trucco e ora sono in grado di rilevare la bocca con una buona precisione. In ogni caso, questo compito sembra molto più complicato del rilevamento dei volti, anche se sto usando immagini "semplici", che sono dirette e completamente frontali.

Ecco due esempi: un successo e un fallimento.

ok wrong

+0

Ehi, Posso ottenere un collegamento al set di dati da dove hai ottenuto queste immagini? Ho le immagini con me ma non riesco a trovare il link alla pagina. Ho bisogno di citazioni. Grazie! –

+0

@AninditKarmakar Ciao, è il set di dati KDEF: http://www.emotionlab.se/resources/kdef – minomic

+0

@minomic Puoi guardare su questo argomento: http://stackoverflow.com/questions/37921913/java-and- haarcascade-face epizootica rilevamento bocca-as-the-naso – Adamo

0

ero di fronte lo stesso problema, quindi concentrata solo sulla metà inferiore del viso e creato un ROI del volto rilevato. Assomiglia a questo:

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

Dove faccia è la faccia rilevata dall'immagine.

Questo ha creato una ROI dalla faccia rilevata solo per la metà inferiore. Altrimenti il ​​rilevatore di bocca stava rilevando gli occhi anche come bocca.

Quindi utilizzare lo MouthCascade.xml da questo collegamento: http://alereimondo.no-ip.org/OpenCV/34 che è molto più efficiente di quello integrato di OpenCV.

Problemi correlati