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

問題を解決できたと思います。顔の下半分に焦点を合わせ、スケール ファクターを大きくするとうまくいき、精度の高い口を検出できるようになりました。とにかく、このタスクは、顔検出よりもはるかに複雑に思えます。「単純な」画像を使用している場合でも、つまり、まっすぐで正面全体を意味します。

成功と失敗の 2 つの例を次に示します。

わかった 違う

于 2015-04-18T20:40:25.413 に答える