zoukankan      html  css  js  c++  java
  • 图像处理项目——人脸检测—视频

    人脸检测 

    *开发环境为visual studio2010
    *使用的是opencv中的Haart特征分类器,harr Cascades
    *检测对象为视频中的人脸

    
    
    一:主要步骤
    1.加载分类器,将人脸检测分类器和笑脸检测分类器放在项目目录中去
    2.调用detecMutiScale()函数检测,对函数中相关的参数进行修改调整,
     是检测的结果更加精确
    3.打开摄像头或者视频文件,把检测到的人脸用矩形画出来

    opencv中用来做目标检测的级联分类器的一个
    类,其结构如下:
    The constructor for the cv::CascadeClassifier object is:
         
          cv::CascadeClassifier::CascadeClassifier(
          const String& filename
      );
    这个构造函数只需要一个参数,即存储xml文件的名字,此外还有一个默认参数,即是使用
    load()成员加载级联。
    二:代码
    /***************************************************************
    主要步骤:
    1.将人脸检测分类器放在项目目录中去,加载Haart特征分类器(描述人体各个部位的Haar特征值,包括人脸、眼睛、嘴唇等)
    2.调用detecMutiScale()函数检测,对函数中相关的参数进行修改调整
    3.打开摄像头或者视频文件把检测到的人脸用矩形画出来
    ****************************************************************/
    #include "opencv2/objdetect.hpp"                                                                                   
    #include "opencv2/videoio.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    using namespace cv;
    
    String Path_faceCascade;          //定义xml文件路径,训练模型以xml文件格式保存
    CascadeClassifier faceCascade;   //定义人脸分类器,opencv中的harr Cascades
       
    int main() 
    {  
        Path_faceCascade = "models/haarcascade_frontalface_default.xml";   //导入xml文件,给Path_faceCascade
        if( !faceCascade.load( Path_faceCascade ) ) { 
          printf("--(!)Error loading face cascade
    "); 
          return -1; 
      }
      
        VideoCapture cap;    
        Mat img, imgGray;  
        std::vector<Rect> faces;
        cap.open(0);   //打开摄像头  
        //cap.open("../data/test.avi");   //打开视频      
        int c = 0;    
        if(!cap.isOpened()){  
          return 1;  
        }  
      
        while(c!=27)  
        {  
            cap>>img;          
            cvtColor(img, imgGray, CV_RGB2GRAY);       
      
           faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸  
           //画框
           if(faces.size()>0){    
              for(int i =0; i < faces.size(); i++ ) {  
                  rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),Scalar(0, 255, 0), 1, 8);    //框出人脸位置  
              }  
           }  
          
           imshow("Camera", img);  
           int k = waitKey(500);
        //按"q"退出
        if(k == 113){
          destroyAllWindows();
          break;
        }  
      }
    }  

    三:检测结果

    四:稍微修改代码调通对视频文件中人脸的检测

    /***************************************************************
    主要步骤:
    1.将人脸检测分类器放在项目目录中去,加载Haart特征分类器(描述人体各个部位的Haar特征值,包括人脸、眼睛、嘴唇等)
    2.调用detecMutiScale()函数检测,对函数中相关的参数进行修改调整
    3.打开摄像头或者视频文件把检测到的人脸用矩形画出来
    ****************************************************************/
    #include "opencv2/objdetect.hpp"                                                                                   
    #include "opencv2/videoio.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    using namespace cv;
    
    String Path_faceCascade;          //定义xml文件路径,训练模型以xml文件格式保存
    CascadeClassifier faceCascade;   //定义人脸分类器,opencv中的harr Cascades
       
    int main() 
    {  
        Path_faceCascade = "models/haarcascade_frontalface_default.xml";   //导入xml文件,给Path_faceCascade
        if( !faceCascade.load( Path_faceCascade ) ) { 
          printf("--(!)Error loading face cascade
    "); 
          return -1; 
      }
      
        VideoCapture cap;   
         
        std::vector<Rect> faces;
        //cap.open(0);   //打开摄像头  
        cap.open("E://demo.avi");   //打开视频   
        if(!cap.isOpened()){  
          return 1;  
        }  
      
        Mat img, imgGray;  
        while(1)  
        {  
            
            cap>>img;          
            cvtColor(img, imgGray, CV_RGB2GRAY);       
      
           faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸  
           //画框
           if(faces.size()>0){    
              for(int i =0; i < faces.size(); i++ ) {  
                  rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),Scalar(0, 255, 0), 1, 8);    //框出人脸位置  
              }  
           }  
          
           imshow("Camera", img);  
          waitKey(30);
        }  
      cap.release();//释放资源
    }  

    检测结果

     
    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/10526219.html
Copyright © 2011-2022 走看看