opencv 级联分类器,人脸检测

本章内容:
     * 1.人脸识别
     * 2.人眼识别

 

输出结果

opencv 级联分类器,人脸检测

源码

//#include <QCoreApplication>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>

int main(int argc, char *argv[])
{
    /*本章内容:
     * 1.人脸识别
     * 2.人眼识别
    */
    cv::VideoCapture vCap;
    vCap.open(0);
    if(!vCap.isOpened()){
        std::cout << "视频已经被占用" << std::endl;
        return -1;
    }
    cv::Mat frame;
    cv::Mat gray;
    int key;
    // 创建级连分类器
    cv::CascadeClassifier face_cascade;
    cv::CascadeClassifier eye_cascade;
    std::vector<cv::Rect> faceFrames;
    std::vector<cv::Rect> eyeFrames;
    if(!face_cascade.load("/home/wang/opencv/opencv/data/haarcascades/haarcascade_frontalface_alt.xml")){
        std::cout << "人脸识别级联分类器打开失败" << std::endl;
        return -1;
    }
    if(!eye_cascade.load("/home/wang/opencv/opencv/data/haarcascades/haarcascade_eye.xml")){
        std::cout << "人眼识别级联分类器打开失败" << std::endl;
        return -1;
    }
    std::cout << "进入人脸识别" << std::endl;
    while(1){
        key= cv::waitKey(100);
        if((key == 'q') || (key == 'Q')) break;

        bool ret = vCap.read(frame);
        if (!ret) { std::cout << "读取视频是失败" << std::endl; continue; }
        cv::cvtColor(frame,gray,cv::COLOR_BGR2GRAY);
        cv::equalizeHist(gray,gray);
        face_cascade.detectMultiScale(gray,faceFrames,1.2,3,0,cv::Size(30,30));
        for(int i=0;i<faceFrames.size();i++){
            cv::Rect roi;
            roi.x = faceFrames[i].x;
            roi.y = faceFrames[i].y;
            roi.width = faceFrames[i].width;
            roi.height = faceFrames[i].height;
            cv::Mat face = frame(roi);
            eye_cascade.detectMultiScale(face,eyeFrames,1.3,3,0,cv::Size(20,20));
            for(int j=0;j<eyeFrames.size();j++){
                cv::Rect eyeROI;
                eyeROI.x += eyeFrames[j].x + faceFrames[j].x;
                eyeROI.y += eyeFrames[j].y + faceFrames[j].y;
                eyeROI.width += eyeFrames[j].width;
                eyeROI.height += eyeFrames[j].height;
                cv::rectangle(frame,eyeROI,cv::Scalar(0,255,0),2);
            }

            cv::rectangle(frame,faceFrames[i],cv::Scalar(0,0,255),2);
        }
        cv::imshow("VideoCapture", frame);
    }
    vCap.release();
    std::cout << "按任意键退出" << std::endl;
    cv::waitKey(0);
    return 1;
}