2015-04-18 5 views
5

Я пытаюсь обнаружить рот в изображении с OpenCV, поэтому я использую следующий код:Детектирование рот с 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); 
} 

классификаторы haarcascade_frontalface_alt.xml и haarcascade_mcs_mouth.xml.

Лицо обнаружено правильно, но рот не является: я также получаю глаза и некоторые другие части, такие как лоб. Есть ли способ обнаружить только рот?

ответ

5

Я думаю, мне удалось решить проблему: сосредоточиться на нижней половине лица и увеличить масштабный коэффициент сделал трюк, и теперь я могу обнаружить рот с хорошей точностью. В любом случае эта задача кажется намного сложнее, чем распознавание лиц, даже если я использую «простые» образы, что означает прямой и полный лобный.

Вот два примера: успех и сбой.

ok wrong

+0

Эй, могу ли я получить ссылку на набор данных, откуда вы получили эти изображения? У меня есть изображения со мной, но я не могу найти ссылку на страницу. Мне нужно цитаты. Благодаря! –

+0

@AninditKarmakar Привет, это набор данных KDEF: http://www.emotionlab.se/resources/kdef – minomic

+0

@minomic Вы можете посмотреть на эту тему: http://stackoverflow.com/questions/37921913/java-and- haarcascade-лицо и рот обнаружение-рот, как-заместитель носа – Adamo

0

я столкнулась с той же проблемой, поэтому я сосредоточен только на нижней половине лица и создал ROI от обнаруженного лица. Это выглядит примерно так:

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

Где лицо - это лицо, обнаруженное на изображении.

Это создало ROI от обнаруженного лица только для нижней половины. Кроме того, детектор рта обнаруживал глаза также как рот.

Затем используйте MouthCascade.xml по этой ссылке: http://alereimondo.no-ip.org/OpenCV/34 , который намного эффективнее, чем встроенный OpenCV.

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

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