图像处理项目——人脸检测—识别

人脸识别

*开发环境为visual studio2010
*使用的是opencv中的Haart特征分类器,harr Cascades
*识别对象为视频中的人脸
 
一:主要步骤

1.打开摄像头。
2.加载人脸检测器,加载人脸模型。
3.待识别图像预处理 resize cvtColor 等,人脸检测
4.把检测到的人脸与人脸模型里面的对比,找出这是谁的脸。
5.如果人脸是自己拍照的人脸,显示自己的名字“face_zsc”。

二:代码
 1 #include<opencv2opencv.hpp>  
 2 #include<opencv2face.hpp>
 3 #include<opencv2corecore.hpp>
 4 #include<opencv2facefacerec.hpp>
 5 #include <fstream>  
 6 #include <sstream> 
 7 #include<math.h>
 8  
 9 using namespace std;
10 using namespace cv;
11 using namespace cv::face;
12  
13 RNG g_rng(12345);
14 Ptr<FaceRecognizer> model;
15 //识别图片
16 int Predict(Mat src_image)  
17 {
18     Mat face_test;
19     int predict = 0;
20     //截取的ROI人脸尺寸调整
21     if (src_image.rows >= 120)
22     {
23         //改变图像大小,使用双线性差值
24         resize(src_image, face_test, Size(92, 112));
25  
26     }
27     //判断是否正确检测ROI
28     if (!face_test.empty())
29     {
30         
31         predict = model->predict(face_test);
32     }
33     cout << predict << endl;
34     return predict;
35 }
36 int main()
37 {
38     VideoCapture cap(0);    
39     if (!cap.isOpened())
40     {
41         return -1;
42     }
43     Mat frame;
44     Mat gray;
45     //这个分类器是人脸检测所用
46     CascadeClassifier cascade;
47     bool stop = false;
48     //训练好的文件名称,放置在可执行文件同目录下  
49     cascade.load("haarcascade_frontalface_alt2.xml");
50  
51     model = FisherFaceRecognizer::create();
52     //1.加载训练好的分类器
53     model->read("MyFaceModel.xml");
54      //3.利用摄像头采集人脸并识别
55     while (1)
56     {
57         cap >> frame;  
58         vector<Rect> faces(0);              //存放人脸的向量容器        
59         cvtColor(frame, gray, CV_RGB2GRAY);//灰度化
60         equalizeHist(gray, gray);          //直方图均值化
61         //检测人脸
62         cascade.detectMultiScale(gray, faces,1.1, 4, 0 
63             | CV_HAAR_DO_ROUGH_SEARCH,
64              Size(30, 30), Size(500, 500));
65         Mat* pImage_roi = new Mat[faces.size()];   
66         Mat face;
67         Point text_lb;//文本写在的位置
68         //框出人脸
69         string str;
70         for (int i = 0; i < faces.size(); i++)
71         {
72             pImage_roi[i] = gray(faces[i]); //将所有的脸部保存起来
73             text_lb = Point(faces[i].x, faces[i].y);
74             if (pImage_roi[i].empty())
75                 continue;
76             switch (Predict(pImage_roi[i])) //对每张脸都识别
77             {
78             case 22:str = "face_zsc"; break;
79             default: str = "Error"; break;
80             }
81             Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//所取的颜色任意值
82             rectangle(frame, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), color, 1, 8);//放入缓存
83             putText(frame, str, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));//添加文字
84         }
85  
86         delete[]pImage_roi;
87         imshow("face", frame);
88         waitKey(200);    
89     }
90  
91     return 0;
92 }
93  

三:识别结果

检测出人脸,并识别出是谁的人脸

萍水相逢逢萍水,浮萍之水水浮萍!
原文地址:https://www.cnblogs.com/AIBigTruth/p/10550450.html