• 人脸识别中的检测(在Opencv中加入了QT)


      1 #include <opencv2/highgui/highgui.hpp>
      2 #include <opencv2/imgproc/imgproc.hpp>
      3 #include <opencv2/core/core.hpp>
      4 #include <opencv2/objdetect/objdetect.hpp>
      5 #include <QDebug>
      6 
      7 using namespace cv;
      8 
      9 void detectAndDraw( Mat& img, CascadeClassifier& cascade,
     10                     CascadeClassifier& nestedCascade,
     11                     double scale, bool tryflip );
     12 
     13 int main()
     14 {
     15     VideoCapture cap(0);    //打开默认摄像头
     16     if(!cap.isOpened())
     17     {
     18         return -1;
     19     }
     20     Mat frame;
     21     Mat edges;
     22 
     23     CascadeClassifier cascade, nestedCascade;
     24     bool stop = false;
     25     //训练好的文件名称,放置在可执行文件同目录下
     26     cascade.load("haarcascade_frontalface_alt.xml");
     27     nestedCascade.load("haarcascade_eye_tree_eyeglasses.xml");
     28     while(!stop)
     29     {
     30         cap>>frame;
     31         detectAndDraw( frame, cascade, nestedCascade,2,0 );
     32         if(waitKey(30) >=0)
     33             stop = true;
     34     }
     35     return 0;
     36 }
     37 void detectAndDraw( Mat& img, CascadeClassifier& cascade,
     38                     CascadeClassifier& nestedCascade,
     39                     double scale, bool tryflip )
     40 {
     41     int i = 0;
     42     double t = 0;
     43     //建立用于存放人脸的向量容器
     44     vector<Rect> faces, faces2;
     45     //定义一些颜色,用来标示不同的人脸
     46     const static Scalar colors[] =  { CV_RGB(0,0,255),
     47         CV_RGB(0,128,255),
     48         CV_RGB(0,255,255),
     49         CV_RGB(0,255,0),
     50         CV_RGB(255,128,0),
     51         CV_RGB(255,255,0),
     52         CV_RGB(255,0,0),
     53         CV_RGB(255,0,255)} ;
     54     //建立缩小的图片,加快检测速度
     55     //nt cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!
     56     Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );
     57     //转成灰度图像,Harr特征基于灰度图
     58     cvtColor( img, gray, CV_BGR2GRAY );
     59     //改变图像大小,使用双线性差值
     60     resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
     61     //变换后的图像进行直方图均值化处理
     62     equalizeHist( smallImg, smallImg );
     63 
     64     //程序开始和结束插入此函数获取时间,经过计算求得算法执行时间
     65     t = (double)cvGetTickCount();
     66     //检测人脸
     67     //detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示
     68     //每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大
     69     //小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的
     70     //最小最大尺寸
     71     cascade.detectMultiScale( smallImg, faces,
     72         1.1, 2, 0
     73         //|CV_HAAR_FIND_BIGGEST_OBJECT
     74         //|CV_HAAR_DO_ROUGH_SEARCH
     75         |CV_HAAR_SCALE_IMAGE
     76         ,
     77         Size(30, 30));
     78     //如果使能,翻转图像继续检测
     79     if( tryflip )
     80     {
     81         flip(smallImg, smallImg, 1);
     82         cascade.detectMultiScale( smallImg, faces2,
     83                                  1.1, 2, 0
     84                                  //|CV_HAAR_FIND_BIGGEST_OBJECT
     85                                  //|CV_HAAR_DO_ROUGH_SEARCH
     86                                  |CV_HAAR_SCALE_IMAGE
     87                                  ,
     88                                  Size(30, 30) );
     89         for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ )
     90         {
     91             faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
     92         }
     93     }
     94     t = (double)cvGetTickCount() - t;
     95  //   qDebug( "detection time = %g ms
    ", t/((double)cvGetTickFrequency()*1000.) );
     96     for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
     97     {
     98         Mat smallImgROI;
     99         vector<Rect> nestedObjects;
    100         Point center;
    101         Scalar color = colors[i%8];
    102         int radius;
    103 
    104         double aspect_ratio = (double)r->width/r->height;
    105         if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
    106         {
    107             //标示人脸时在缩小之前的图像上标示,所以这里根据缩放比例换算回去
    108             center.x = cvRound((r->x + r->width*0.5)*scale);
    109             center.y = cvRound((r->y + r->height*0.5)*scale);
    110             radius = cvRound((r->width + r->height)*0.25*scale);
    111             circle( img, center, radius, color, 3, 8, 0 );
    112         }
    113         else
    114             rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),
    115                        cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),
    116                        color, 3, 8, 0);
    117         if( nestedCascade.empty() )
    118             continue;
    119         smallImgROI = smallImg(*r);
    120         //同样方法检测人眼
    121         nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
    122             1.1, 2, 0
    123             //|CV_HAAR_FIND_BIGGEST_OBJECT
    124             //|CV_HAAR_DO_ROUGH_SEARCH
    125             //|CV_HAAR_DO_CANNY_PRUNING
    126             |CV_HAAR_SCALE_IMAGE
    127             ,
    128             Size(30, 30) );
    129         for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
    130         {
    131             center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
    132             center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
    133             radius = cvRound((nr->width + nr->height)*0.25*scale);
    134             circle( img, center, radius, color, 3, 8, 0 );
    135         }
    136     }
    137     cv::imshow( "result", img );
    138 }
  • 相关阅读:
    多级别过滤器
    MongoDBAppender
    org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
    简单引入logback
    Logback configuration
    PatternLayoutEncoder 输出格式
    ConsoleAppender
    FileAppender
    Linux学习笔记
    GitLab CI/CD 学习记录
  • 原文地址:https://www.cnblogs.com/zzuyczhang/p/4349673.html
Copyright © 2020-2023  润新知