人脸识别
*开发环境为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
三:识别结果
检测出人脸,并识别出是谁的人脸