注意:
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
参考:贾老师的视频