• 级联分类器的使用


     

    注意:

        1.调用USB的摄像头,首先禁止自己笔记本或者台式机的自带摄像头,然后重新启动。

        2.opencv自带的训练文件最好复制放在到源目录下,我试了直接在安装文件中读取不行,可能是我读取有问题吧!

          3.没有我们想的那么高大上,就是通过一个特征检测去训练数据而已,用起来很简单,但是深层次理解又很难。


     opencv自带的训练文件:

     1 
    //照片检测
    #if 0 2 #include <opencv2/opencv.hpp> 3 #include <iostream> 4 5 using namespace cv; 6 using namespace std; 7 8 //String filename = "E:Program Files (x86)opencv3.1opencvwjy_buildinstalletchaarcascadeshaarcascade_frontalface_alt.xml"; 9 CascadeClassifier face_classifier; 10 int main(int argc, char** argv) 11 { 12 if (!face_classifier.load("haarcascade_frontalface_alt.xml")) 13 { 14 printf("can't open filename ... "); 15 return -1; 16 } 17 18 //face_classifier.load(filename); 19 Mat inputimage = imread("2.jpg"); 20 if (!inputimage.data) return -1; 21 Mat grayImage; 22 cvtColor(inputimage, grayImage, COLOR_BGR2GRAY); 23 equalizeHist(grayImage, grayImage); 24 vector<Rect> face; 25 face_classifier.detectMultiScale(grayImage, face, 1.2, 3, 0, Size(24, 24)); 26 for (size_t i = 0; i < face.size(); i++) 27 { 28 rectangle(inputimage, face[i], Scalar(0, 0, 255), 2); 29 } 30 31 waitKey(0); 32 return 0; 33 } 34 #endif
    //视频检测
    35 #if 1 36 #include<opencv2/opencv.hpp> 37 #include<iostream> 38 39 using namespace cv; 40 using namespace std; 41 42 CascadeClassifier face_cascader; 43 CascadeClassifier eye_cascader; 44 String facefile = "haarcascade_frontalface_alt.xml"; 45 String eyefile = "haarcascade_eye.xml"; 46 47 int main(int argc, char** argv) { 48 if (!face_cascader.load(facefile)) { 49 printf("could not load face feature data... "); 50 return -1; 51 } 52 if (!eye_cascader.load(eyefile)) { 53 printf("could not load eye feature data... "); 54 return -1; 55 } 56 namedWindow("video_demo", 1); 57 VideoCapture capture(0); 58 Mat fream; 59 Mat gray; 60 vector<Rect> faces; 61 vector<Rect> eyes; 62 while (capture.read(fream)) 63 { 64 cvtColor(fream, gray, CV_BGR2GRAY); 65 equalizeHist(gray, gray); 66 face_cascader.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30)); 67 Mat imageRoi; 68 for (size_t i = 0; i < faces.size(); i++) 69 { 70 imageRoi = fream(Rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height / 2)); 71 rectangle(fream,faces[i],Scalar(0,0,255),2); 72 } 73 eye_cascader.detectMultiScale(imageRoi, eyes, 1.2, 3, 0, Size(20, 20)); 74 for (size_t i = 0; i < eyes.size(); i++) 75 { 76 //Rect((eyes[i].x + faces[i].x), (eyes[i].y + faces[i].y), eyes[i].width, eyes[i].height); 77 rectangle(fream, Rect((eyes[i].x + faces[i].x), (eyes[i].y + faces[i].y), eyes[i].width, eyes[i].height), Scalar(0, 255, 0),2); 78 } 79 imshow("video_demo", fream); 80 char c = waitKey(30); 81 if (c == 27) { 82 break; 83 } 84 } 85 waitKey(0); 86 return 0; 87 } 88 #endif

     

     读取视频文件:

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace cv;
     5 using namespace std;
     6 
     7 CascadeClassifier face_cascader;
     8 String haarfile = "D:/opencv3.1/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml";
     9 String lbpfile = "D:/opencv3.1/opencv/build/etc/lbpcascades/lbpcascade_frontalface.xml";
    10 int main(int argc, char** argv) {
    11     if (!face_cascader.load(lbpfile)) {
    12         printf("could not load image...
    ");
    13         return -1;
    14     }
    15     namedWindow("demo-win", CV_WINDOW_AUTOSIZE);
    16     VideoCapture capture;
    17     Mat frame;
    18     Mat gray;
    19     vector<Rect> faces;
    20     capture.open("D:/vcprojects/images/visit.mp4");
    21 
    22     while (capture.read(frame)) {
    23         cvtColor(frame, gray, COLOR_BGR2GRAY);
    24         equalizeHist(gray, gray);
    25         face_cascader.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
    26         for (size_t t = 0; t < faces.size(); t++) {
    27             rectangle(frame, faces[t], Scalar(255, 0, 0), 2, 8, 0);
    28         }
    29         imshow("demo-win", frame);
    30         char c = waitKey(50);
    31         if (c == 27) { // ESC
    32             break;
    33         }
    34     }
    35 
    36     // release resource
    37     capture.release();
    38     waitKey(0);
    39     return 0;
    40 }

     检测猫脸:

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace cv;
     5 using namespace std;
     6 
     7 String catfile = "D:/opencv3.1/opencv/build/etc/haarcascades/haarcascade_frontalcatface_extended.xml";
     8 CascadeClassifier catface_detector;
     9 int main(int argc, char** argv) {
    10     if (!catface_detector.load(catfile)) {
    11         printf("could not load image...
    ");
    12         return -1;
    13     }
    14     Mat src = imread("D:/vcprojects/images/twocat.png");
    15     if (src.empty()) {
    16         printf("could not load image...
    ");
    17         return -1;
    18     }
    19     imshow("input image", src);
    20 
    21     Mat gray;
    22     vector<Rect> cats;
    23     cvtColor(src, gray, COLOR_BGR2GRAY);
    24     equalizeHist(gray, gray);
    25 
    26     catface_detector.detectMultiScale(gray, cats, 1.1, 3, 0, Size(70, 70));
    27     for (size_t t = 0; t < cats.size(); t++) {
    28         rectangle(src, cats[t], Scalar(0, 0, 255), 2, 8, 0);
    29     }
    30 
    31     // show
    32     namedWindow("Cat Face Detector Demo", CV_WINDOW_AUTOSIZE);
    33     imshow("Cat Face Detector Demo", src);
    34 
    35     waitKey(0);
    36     return 0;
    37 }

     人脸+人眼实时监测(这个很不准确,而且程序容易崩溃,至于崩溃的原因我也不行去找了,没意义,反正又不能实际使用)

      1 #if 1
      2 #include<opencv2/opencv.hpp>
      3 #include<iostream>
      4 
      5 using namespace cv;
      6 using namespace std;
      7 
      8 CascadeClassifier face_cascader;
      9 CascadeClassifier left_eye_cascader;
     10 CascadeClassifier right_eye_cascader;
     11 String face_file = "haarcascade_frontalface_alt.xml";
     12 String left_eye_file = "haarcascade_eye.xml";
     13 String right_eye_file = "haarcascade_eye.xml";
     14 
     15 void trackEye(InputArray& _src, InputArray& _temp, Rect& rect);
     16 int main(int argc, char** argv) {
     17     if (!face_cascader.load(face_file) || !left_eye_cascader.load(left_eye_file) || !right_eye_cascader.load(right_eye_file))
     18     {
     19         printf("cant load file.......");
     20         return -1;
     21     }
     22     Mat fream, gray, leftTemp, rightTemp;
     23     VideoCapture capture(0);
     24     namedWindow("video_demo", 1);
     25     vector<Rect> faces;
     26     vector<Rect> eyes;
     27     while (capture.read(fream))
     28     {
     29         flip(fream, fream, 1);//沿着Y轴翻转
     30         cvtColor(fream, gray, CV_BGR2GRAY);
     31         equalizeHist(gray, gray);
     32         face_cascader.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30));
     33         for (size_t i = 0; i < faces.size(); i++)
     34         {
     35             rectangle(fream, faces[i], Scalar(0, 0, 255), 3);
     36             //两只眼所在的ROI区域
     37             int offy = faces[i].height / 4;
     38             int offx = faces[i].width / 8;
     39             int eyeheight = faces[i].height / 2 - offy;
     40             int eyewidth  = faces[i].width / 2 - offx;
     41             //左眼ROI
     42             Rect leftRect;
     43             leftRect.x = faces[i].x + offx;
     44             leftRect.y = faces[i].y + offy;
     45             leftRect.height = eyeheight;
     46             leftRect.width  = eyewidth ;
     47             Mat lefteye = gray(leftRect);
     48             //检测左眼
     49             left_eye_cascader.detectMultiScale(lefteye, eyes, 1.1, 1, 0, Size(20, 20));
     50             if (!leftTemp.data)
     51             {
     52                 for (size_t i = 0; i < eyes.size(); i++)
     53                 {
     54                     leftRect = eyes[0] + Point(leftRect.x, leftRect.y);
     55                     leftTemp = gray(leftRect);
     56                     rectangle(fream, leftRect, Scalar(0, 255, 255), 3);
     57                 }
     58             }
     59             else
     60             {
     61                 trackEye(lefteye, leftTemp, leftRect);
     62                 if (leftRect.x > 0 && leftRect.y > 0) {
     63                     leftRect.width = leftTemp.cols;
     64                     leftRect.height = leftTemp.rows;
     65                     rectangle(fream, leftRect, Scalar(0, 0, 255), 2, 8, 0);
     66                 }
     67             }
     68         }
     69         imshow("video_demo", fream);
     70         char c = waitKey(100);
     71         if (c == 27) { // ESC
     72             break;
     73         }
     74     }
     75 }
     76 
     77 void trackEye(InputArray& _src, InputArray& _temp, Rect& rect)
     78 {
     79     Mat src  = _src.getMat();
     80     Mat temp = _temp.getMat();
     81     Mat result;
     82     //定义存储匹配结果
     83     int result_width  = src.cols - temp.cols + 1;
     84     int result_height = src.rows - temp.rows + 1;
     85     result.create(Size(result_width, result_height), CV_32FC1);
     86     matchTemplate(src, temp, result, TM_CCORR_NORMED);
     87     //寻找匹配点
     88     double minval, maxval;
     89     Point minloc, maxloc;
     90     minMaxLoc(result, &minval, &maxval, &minloc, &maxloc);
     91     if (maxval > 0.75) {
     92         rect.x = rect.x  + maxloc.x;
     93         rect.y = rect.y  + maxloc.y;
     94         rect.width  = temp.cols;
     95         rect.height = temp.rows;
     96     }
     97     else {
     98         rect.x = rect.y = rect.width = rect.height = 0;
     99     }
    100 }
    101 #endif

    参考:贾老师的视频

  • 相关阅读:
    HTML总结
    Java 基础知识总结 (三、运算符)
    关于JS 事件冒泡和onclick,click,on()事件触发顺序
    Java 基础知识总结 (四、String)
    Java 基础知识总结 (二、基本数据类型)
    websocket实例(显示文件导入处理进度)
    Java 基础知识总结 (一、标识符)
    Java Calendar 注意事项
    Ajax调用SpringMVC ModelAndView 无返回情况
    关于Ajax load页面中js部分$(function(){})的执行顺序
  • 原文地址:https://www.cnblogs.com/wjy-lulu/p/7154112.html
Copyright © 2020-2023  润新知