openCV人脸识别报错

用openCV编写人脸识别项目时,总提示FaceRecognizer没有load以及predict是为什么?
报错代码段是这样的

 Ptr<FaceRecognizer> modelPCA =  EigenFaceRecognizer::create();
        //加载分类器
        modelPCA->load("F:\\SS\\qt\\achieve\\build-test2-Desktop_Qt_6_6_0_MinGW_64_bit-Debug\\MyFacePCAModel.xml");//加载分类器


        if(!face_cascade.load("F:\\SS\\OpenCV\\opencv-4.x\\data\\haarcascades\\haarcascade_frontalface_alt.xml"))
        {
            qDebug("Load face failed!");
            return;
        }

        //检测关于眼睛部位
        //检测
        eye_Classifier.detectMultiScale(cap_gray,eyeRect,1.1,2,0 |CASCADE_SCALE_IMAGE,Size(30,30));
        for(size_t eyeIdx=0 ; eyeIdx<eyeRect.size(); eyeIdx++)
        {
            rectangle(cap,eyeRect[eyeIdx],Scalar(0,0,255));
            //用红色矩形画出检测到的位置
        }

        //检测脸部
        face_cascade.detectMultiScale(cap_gray,faceRect,1.1,2,0 |CASCADE_SCALE_IMAGE,Size(30,30));
        for(size_t i=0;i<faceRect.size();i++)
        {
            rectangle(cap,faceRect[i],Scalar(0,255,0));  //用绿色画出检测到的位置
            Mat faceROI =cap_gray(faceRect[i]);

            int predictPCA=0;
            Mat face_test;
            Point text_lb;

            //改变图像大小
            cv::resize(faceROI,face_test,Size(92,112));
            imshow("frame",face_test);

            predictPCA=modelPCA.predict(face_test);

错误提示这样

img

img

请问这是为什么?

1,因为你load函数用错了,opencv对这个load函数的参数要求是const string或FileStorage类型,而你给的是const char * ,类型不匹配自然报错。
2,predict函数也一样是用法不对,但你没给出结构体内的定义,所以我也看不到。自己跟上一条这样去分析找下吧。这两个问题都是用法不正确。

参考GPT和自己的思路:

根据您的代码和报错信息,看起来是modelPCA没有成功加载对应的xml文件,因此在调用predict方法时出现了错误。您可以先确保xml文件的路径正确无误,然后再尝试重新加载分类器。建议使用绝对路径来避免路径错误。另外,如果仍然存在问题,您也可以尝试使用LBPHFaceRecognizer或FisherFaceRecognizer类进行人脸识别,看是否能够解决问题。

参考GPT和自己的思路:

根据提供的代码及错误提示,可以看出问题可能出现在以下几个方面:

  1. 人脸分类器没有正确加载导致模型无法使用;

  2. 加载模型时文件路径不正确,无法加载模型;

  3. 预测时输入的人脸图像没有成功转换成模型所需要的格式。

针对这些可能的问题,你可以采取以下一些解决方法:

  1. 确认人脸分类器是否已正确加载,并且所使用的路径是否正确。

  2. 确认加载模型时文件路径是否正确,并且确认模型文件是否存在。

  3. 确认预测时输入的人脸图像是否成功转换成模型所需要的格式。可以尝试使用opencv提供的函数resize()等将图像转换成模型需要的格式。

如果以上解决方法均不能解决问题,你可以提供更多的代码及错误提示,以便更好地排查问题。