I am trying to detect a mouth in an image using openCV, so I use the following code:
#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 and haarcascade_mcs_mouth.xml .
The face is detected correctly, but the mouth is missing: I also get the eyes and some other parts, such as the forehead. Is there a way to detect only the mouth?