2015-04-18 75 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.xmlhaarcascade_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.xmlhttp://alereimondo.no-ip.org/OpenCV/34 這比內置的OpenCV更高效。