6

我正在尝试使用 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

面部被正确检测但嘴巴没有被检测到:我还获得了眼睛和其他一些部位,比如前额。有没有办法只检测嘴巴?

4

2 回答 2

6

我想我设法解决了这个问题:专注于脸部的下半部分并增加比例因子就可以了,现在我能够以良好的精度检测到嘴巴。无论如何,这个任务似乎比人脸检测复杂得多,即使我使用的是“简单”的图像,这意味着笔直和完整的正面。

这里有两个例子:成功和失败。

好的 错误的

于 2015-04-18T20:40:25.413 回答
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 高效得多。

于 2017-03-25T11:59:05.013 回答