Какая модель нужна для обнаружения метки лица с помощью OpenCV_Contrib?

Я пытаюсь обнаружить ориентиры человеческого лица с помощью OpenCV_Contrib. Тем не менее, есть некоторые проблемы, чтобы обнаружить ориентиры лица.

Я получил один ответ, который мне нужно использовать " https://github.com/opencv/opencv_3rdparty/blob/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat".

Это работает, но это обнаруживает неправильные ориентиры лица. введите описание изображения здесь

Чтобы сделать его идеальным, я должен найти, какая модель необходима для facemark->loadmodel("loadmodel") *68 точек лица

Как я могу вызвать FacemarkKazemi->loadModel();

Пожалуйста, решите мое любопытство.

bool myDetector(cv::InputArray image, cv::OutputArray faces, cv::CascadeClassifier *face_cascade){
    cv::Mat gray;
    if (image.channels() > 1)
        cvtColor(image, gray, CV_BGR2GRAY);
    else
        gray = image.getMat().clone();
    equalizeHist(gray, gray);
    std::vector<cv::Rect> faces_;
    face_cascade->detectMultiScale(gray, faces_, 1.1, 3, 0, cv::Size(30, 30));
    cv::Mat(faces_).copyTo(faces);
    return true;
}
- (UIImage *) detectFacialLandmark:(UIImage *) image{
    double CurrentTime = CACurrentMediaTime();
    NSString *pathToFaceCascade = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt" ofType:@"xml"];
    NSString *pathToFaceModel = [[NSBundle mainBundle] pathForResource:@"face_landmark_model" ofType:@"dat"];
    cv::Mat faceImage;
    UIImageToMat(image, faceImage);
    cv::CascadeClassifier face_cascade;
    face_cascade.load([pathToFaceCascade UTF8String]);
    cv::face::FacemarkKazemi::Params params;
    cv::Ptr<cv::face::FacemarkKazemi> facemark = cv::face::FacemarkKazemi::create(params);
    facemark->setFaceDetector((cv::face::FN_FaceDetector)myDetector, &face_cascade);

    facemark->loadModel([pathToFaceModel UTF8String]);
    std::vector<cv::Rect> faces;
    facemark->getFaces(faceImage,faces);
    std::vector< std::vector<cv::Point2f> > shapes;
    if(faces.size() > 0){
        if(facemark->fit(faceImage,faces,shapes))
        {
            for( size_t i = 0; i < faces.size(); i++ )
            {
                cv::rectangle(faceImage, faces[i], cvScalar(255, 0, 0));
            }
            for(unsigned long i=0;i<faces.size();i++){
                for(unsigned long k=0;k<shapes[i].size();k++)
                    cv::circle(faceImage,shapes[i][k],5,cv::Scalar(0,0,255),cv::FILLED);
            }
        }
    }
    else{

    }
    UIImage *returnImage = MatToUIImage(faceImage);
    NSLog(@"test processing time : %f", (CACurrentMediaTime() - CurrentTime));
    return returnImage;
}

0 ответов

Другие вопросы по тегам