zoukankan      html  css  js  c++  java
  • 一个简单的人脸检测程序

    基于OpenCV harr级联分类器的人脸及眼睛、鼻子、嘴巴检测程序。

    代码很简单:

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui//highgui.hpp>
    #include <opencv2/objdetect/objdetect.hpp>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main()
        {
    
        cv::CascadeClassifier mFaceDetector;
        cv::CascadeClassifier mEyeDetector;
        cv::CascadeClassifier mMouthDetector;
        cv::CascadeClassifier mNoseDetector;
        //载入四个人脸特征分类器文件,可以从opencv的安装目录中找到
        if( mFaceDetector.empty() )
            mFaceDetector.load( "haarcascade_frontalface_default.xml" );
        if( mEyeDetector.empty() )
            mEyeDetector.load( "haarcascade_mcs_eyepair_big.xml" );
        if( mNoseDetector.empty() )
            mNoseDetector.load("haarcascade_mcs_nose.xml" );
        if( mMouthDetector.empty() )
            mMouthDetector.load( "haarcascade_mcs_mouth.xml" );
    
        //打开视频文件
        //cv::VideoCapture capture("bike.avi");
        //0 open default camera
        cv::VideoCapture capture(0);
        //检查视频是否打开
        if(!capture.isOpened())
            return 1;
    
        // 得到帧率
        double rate= capture.get(CV_CAP_PROP_FPS);
        bool stop(false);
        cv::Mat frame; // 现在的视频帧
        cv::Mat mElabImage;//备份frame图像
    
        cv::namedWindow("Extracted Frame");
    
        // 两帧之间的间隔时间
        int delay= 1000/rate;
        // 循环播放所有的帧
        while (!stop) {
            // 读下一帧
            if (!capture.read(frame))
                break;
            frame.copyTo( mElabImage );
            //检测脸
            //缩放因子
            float scaleFactor = 3.0f; 
            vector< cv::Rect > faceVec;
            mFaceDetector.detectMultiScale( frame, faceVec, scaleFactor );
            int i, j;
            for(  i=0; i<faceVec.size(); i++ )
                {
                cv::rectangle( mElabImage, faceVec[i], CV_RGB(255,0,0), 2 );
                cv::Mat face = frame( faceVec[i] );
                //检测眼睛
                vector< cv::Rect > eyeVec;
                mEyeDetector.detectMultiScale( face, eyeVec );
    
                for( j=0; j<eyeVec.size(); j++ )
                    {
                    cv::Rect rect = eyeVec[j];
                    rect.x += faceVec[i].x;
                    rect.y += faceVec[i].y;
    
                    cv::rectangle( mElabImage, rect, CV_RGB(0,255,0), 2 );
                    }
                //检测鼻子
                vector< cv::Rect > noseVec;
    
                mNoseDetector.detectMultiScale( face, noseVec, 3 );
    
                for( j=0; j<noseVec.size(); j++ )
                    {
                    cv::Rect rect = noseVec[j];
                    rect.x += faceVec[i].x;
                    rect.y += faceVec[i].y;
    
                    cv::rectangle( mElabImage, rect, CV_RGB(0,0,255), 2 );
                    }
    
                //检测嘴巴
                vector< cv::Rect > mouthVec;
                cv::Rect halfRect = faceVec[i];
                halfRect.height /= 2;
                halfRect.y += halfRect.height;
    
                cv::Mat halfFace = frame( halfRect );
    
                mMouthDetector.detectMultiScale( halfFace, mouthVec, 3 );
    
                for(  j=0; j<mouthVec.size(); j++ )
                    {
                    cv::Rect rect = mouthVec[j];
                    rect.x += halfRect.x;
                    rect.y += halfRect.y;
    
                    cv::rectangle( mElabImage, rect, CV_RGB(255,255,255), 2 );
                    }
                }
    
        
            //在窗口中显示图像
            cv::imshow("Extracted Frame",mElabImage);
            // 按任意键停止视频播放
            //if (cv::waitKey(delay)>=0)
            //    stop= true;
            cv::waitKey(20);
            }
        // 关闭视频文件
        capture.release();
        return 0;
        }
  • 相关阅读:
    String的几种初始化方法的区别
    Java编程思想之字符串
    树图 广度优先算法和深度优先算法
    bzoj1047: [HAOI2007]理想的正方形
    bzoj3124: [Sdoi2013]直径
    bzoj3930: [CQOI2015]选数
    bzoj1222: [HNOI2001]产品加工
    bzoj3578: GTY的人类基因组计划2
    bzoj4444: [Scoi2015]国旗计划
    bzoj1040: [ZJOI2008]骑士
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2384257.html
Copyright © 2011-2022 走看看