注意:
1.调用USB的摄像头,首先禁止自己笔记本或者台式机的自带摄像头,然后重新启动。
2.opencv自带的训练文件最好复制放在到源目录下,我试了直接在安装文件中读取不行,可能是我读取有问题吧!
3.没有我们想的那么高大上,就是通过一个特征检测去训练数据而已,用起来很简单,但是深层次理解又很难。
opencv自带的训练文件:
1 //照片检测 #if 0 2 #include3 #include 4 5 using namespace cv; 6 using namespace std; 7 8 //String filename = "E:\Program Files (x86)\opencv3.1\opencv\wjy_build\install\etc\haarcascades\haarcascade_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 ...\n");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 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 136 #include 37 #include 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...\n");50 return -1;51 }52 if (!eye_cascader.load(eyefile)) {53 printf("could not load eye feature data...\n");54 return -1;55 }56 namedWindow("video_demo", 1);57 VideoCapture capture(0);58 Mat fream;59 Mat gray;60 vector faces;61 vector 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 #include2 #include 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...\n");13 return -1;14 }15 namedWindow("demo-win", CV_WINDOW_AUTOSIZE);16 VideoCapture capture;17 Mat frame;18 Mat gray;19 vector 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) { // ESC32 break;33 }34 }35 36 // release resource37 capture.release();38 waitKey(0);39 return 0;40 }
检测猫脸:
1 #include2 #include 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...\n");12 return -1;13 }14 Mat src = imread("D:/vcprojects/images/twocat.png");15 if (src.empty()) {16 printf("could not load image...\n");17 return -1;18 }19 imshow("input image", src);20 21 Mat gray;22 vector 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 // show32 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 #include3 #include 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 faces; 26 vector 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
参考:贾老师的视频