代码之家  ›  专栏  ›  技术社区  ›  Aoi Hyoudou

从实时网络摄像头流中查找人脸的偏航角、侧倾角和俯仰角

  •  0
  • Aoi Hyoudou  · 技术社区  · 2 年前

    我需要从一张脸的网络摄像头流中找到偏航、侧倾和俯仰角度。我使用opencv获取人脸标记并检测人脸。有人能帮助或指导我如何找到并打印这些角度吗? 我正在使用VisualStudio2022(社区)。

    Ptr<Facemark> facemark; //mark detection
    CascadeClassifier faceDetector; //face detection
    
    void process(Mat img, Mat imgcol) {
        vector<Rect> faces;
        faceDetector.detectMultiScale(img, faces);
        Mat imFace;
        if (faces.size() != 0) {
            for (size_t i = 0; i < faces.size(); i++)
            {
                cv::rectangle(imgcol, faces[i], Scalar(255, 0, 0));
                imFace = imgcol(faces[i]);
                resize(imFace, imFace, Size(imFace.cols * 5, imFace.rows * 5));
                faces[i] = Rect(faces[i].x = 0, faces[i].y = 0, faces[i].width * 5,
                    (faces[i].height) * 5);
            }
            vector< vector<Point2f> > shapes;
            if (facemark->fit(imFace, faces, shapes))   
            {
                for (unsigned long i = 0; i < faces.size(); i++) {
                    for (unsigned long k = 0; k < shapes[i].size(); k++) {
                        cv::circle(imFace, shapes[i][k], 5, cv::Scalar(0, 0, 255),FILLED);
                    }
                }
            }
            namedWindow("Detected_shape");
            imshow("Detected_shape", imFace);
            waitKey(5);
        }
    
        else {
            cout << "Faces not detected." << endl;
        }
    
    }
    
    int main()
    {
        facemark = FacemarkLBF::create();
        facemark->loadModel("lbfmodel.yml");
        faceDetector.load("D:/opencv/build/install/etc/haarcascades/haarcascade_frontalface_alt2.xml");
        cout << "Loaded model" << endl;
    
        VideoCapture cap(1);  //capture image
        int initialized = 0;
    
        for (;;)
        {
            if (!cap.isOpened()) {
               cout << "Video Capture Fail" << endl;
                break;
            }
    
            else {
                Mat img;   //image containers
                Mat imgbw;
                cap >> img;   //image from webcam
    
                resize(img, img, Size(460, 460), 0, 0, INTER_LINEAR_EXACT);
                cvtColor(img, imgbw, COLOR_BGR2GRAY);
                process(imgbw, img);
                namedWindow("Live", WINDOW_AUTOSIZE);
                imshow("Live", img);
                waitKey(5);
            }
        }
    }
    

    代码包括到目前为止我能做的事情。它检测人脸和地标。我如何找到角度并从中打印出来?

    0 回复  |  直到 2 年前