级联分类器的使用

 

注意:

    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

参考:贾老师的视频

原文地址:https://www.cnblogs.com/wjy-lulu/p/7154112.html