【OpenCV】人脸识别——识别是谁

来源:互联网 发布:服装网络推广方案 编辑:程序博客网 时间:2024/04/29 19:48

1、检测出人脸;

2、截取人脸ROI;

3、训练人脸库;(每人训练25张)

4、调整成100*100,归一化;

5、识别人脸;

// WinFace.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>  #include <opencv2/core/core.hpp>  #include <opencv2/contrib/contrib.hpp> #include <opencv2/highgui/highgui.hpp>  using namespace cv;<img src="http://img.blog.csdn.net/20160902151646375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />using namespace std;vector<Mat> images;vector<int> labels;Mat FuncTrain(Mat src, int label){normalize(src, src, 0, 255, NORM_MINMAX, CV_8UC1);images.push_back(src);labels.push_back(label);return src;}int main(){// images for first personMat src = imread(".//100_100//img_01.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);src = imread(".//100_100//img_02.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);src = imread(".//100_100//img_03.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);// images for second person  src = imread(".//100_100//img_11.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);src = imread(".//100_100//img_12.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);src = imread(".//100_100//img_13.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);// images for third person  src = imread(".//100_100//img_21.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);src = imread(".//100_100//img_22.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);src = imread(".//100_100//img_23.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);Ptr<FaceRecognizer> model = createFisherFaceRecognizer();model->train(images, labels);Mat img = imread("img_1.png", CV_LOAD_IMAGE_GRAYSCALE);if (img.empty()){cout << "Error!" << endl;return 0;}int predicted = model->predict(img);switch (predicted){case 0:cout << "predicted:" << predicted  << "   duan "<< endl;break;case 1:cout << "predicted:" << predicted << "   zhuang " << endl;break;case 2:cout << "predicted:" << predicted << "   chen " << endl;break;default:break;}namedWindow("Test");imshow("Test", img);waitKey();return 0;}


// WinFace.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>  #include <opencv2/core/core.hpp>  #include <opencv2/contrib/contrib.hpp> #include <opencv2/highgui/highgui.hpp>  #include <opencv2/imgproc/imgproc.hpp> using namespace cv;using namespace std;vector<Mat> images;vector<int> labels;Ptr<FaceRecognizer> model;CascadeClassifier face_cascade;CascadeClassifier eyes_cascade;string window_name = "Face detection";Mat FuncTrain(Mat src, int label){normalize(src, src, 0, 255, NORM_MINMAX, CV_8UC1);images.push_back(src);labels.push_back(label);return src;}void FaceTrain(){// images for first personMat src = imread(".//100_100//img_01.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);src = imread(".//100_100//img_02.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);src = imread(".//100_100//img_03.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);// images for second person  src = imread(".//100_100//img_11.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);src = imread(".//100_100//img_12.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);src = imread(".//100_100//img_13.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);// images for third person  src = imread(".//100_100//img_21.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);src = imread(".//100_100//img_22.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);src = imread(".//100_100//img_23.png", CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);model = createFisherFaceRecognizer();model->train(images, labels);}void detectAndDisplay(Mat frame){std::vector<Rect> faces;Mat frame_gray;cvtColor(frame, frame_gray, CV_BGR2GRAY);equalizeHist(frame_gray, frame_gray);//-- Detect facesface_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));for (size_t i = 0; i < faces.size(); i++){Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);Mat faceROI = frame_gray(faces[i]);//std::vector<Rect> eyes;////-- In each face, detect eyes//eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));////--------result------//for (size_t j = 0; j < eyes.size(); j++)//{//Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);//int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);//circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);//}//---------------Mat faceModel;faceROI.copyTo(faceModel);resize(faceModel, faceModel, Size(100, 100), 0, 0, CV_INTER_LINEAR);int predicted = model->predict(faceModel);string str;switch (predicted){case 0:str = "duan";break;case 1:str = "zhuang";break;case 2:str = "chen";break;default:break;}putText(frame, str, center, CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 255, 0), 2, 8);}//-- Show what you gotimshow(window_name, frame);}int main(){VideoCapture cap(0);if (!cap.isOpened()){cout << "Fail Open Camera !" << endl;return -1;}String face_cascade_name = "haarcascade_frontalface_alt.xml";String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";if (!face_cascade.load(face_cascade_name)){ cout << "--(!)Error loading" << endl; return -1; };if (!eyes_cascade.load(eyes_cascade_name)){ cout << "--(!)Error loading" << endl; return -1; };FaceTrain();//人脸库训练namedWindow(window_name);bool stop = false;while (!stop){Mat frame;cap >> frame;if (!frame.empty()){detectAndDisplay(frame);}if (waitKey(30) >= 0)stop = true;}return 0;}


// WinFace.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>  #include <opencv2/core/core.hpp>  #include <opencv2/contrib/contrib.hpp> #include <opencv2/highgui/highgui.hpp>  #include <opencv2/imgproc/imgproc.hpp> using namespace cv;using namespace std;vector<Mat> images;vector<int> labels;Ptr<FaceRecognizer> model;CascadeClassifier face_cascade;CascadeClassifier eyes_cascade;string window_name = "Face detection";int nNum = 0;Mat FuncTrain(Mat src, int label){normalize(src, src, 0, 255, NORM_MINMAX, CV_8UC1);images.push_back(src);labels.push_back(label);return src;}void FaceTrain(){Mat src;for (size_t i = 1; i <= 25; i++){char ptr[50];sprintf_s(ptr, ".//data//duan//duan_%d.png", i);src = imread(ptr, CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 0);}for (size_t i = 1; i <= 25; i++){char ptr[50];sprintf_s(ptr, ".//data//zhuang//zhuang_%d.png", i);src = imread(ptr, CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 1);}for (size_t i = 1; i <= 25; i++){char ptr[50];sprintf_s(ptr, ".//data//chen//chen_%d.png", i);src = imread(ptr, CV_LOAD_IMAGE_GRAYSCALE);FuncTrain(src, 2);}model = createFisherFaceRecognizer();model->train(images, labels);}void detectAndDisplay(Mat frame){std::vector<Rect> faces;Mat frame_gray;cvtColor(frame, frame_gray, CV_BGR2GRAY);equalizeHist(frame_gray, frame_gray);//-- Detect facesface_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));for (size_t i = 0; i < faces.size(); i++){Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);Scalar facecolor(rand() & 255, rand() & 255, rand() & 255);//ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, facecolor, 4, 8, 0);rectangle(frame, faces[i], facecolor, 2, 8, 0);char strCenter[50];sprintf_s(strCenter, "[%d, %d]", center.x, center.y);putText(frame, strCenter, center, CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 255, 0), 1, 8);Mat faceROI = frame_gray(faces[i]);//std::vector<Rect> eyes;////-- In each face, detect eyes//eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));////--------result------//for (size_t j = 0; j < eyes.size(); j++)//{//Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);//int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);//circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);//}//---------------Mat faceModel;faceROI.copyTo(faceModel);resize(faceModel, faceModel, Size(100, 100), 0, 0, CV_INTER_LINEAR);//char ptr[50];//nNum++;//sprintf_s(ptr, ".//data//chen//chen_%d.png", nNum);//imwrite(ptr, faceModel);int label = -1;double confidence = 0.0;model->predict(faceModel, label, confidence);cout << "label:" << label << "    confidence:" << confidence << endl;string str;switch (label){case 0:str = "Duan";break;case 1:str = "Zhuang";break;case 2:str = "Chen";break;default:str = "Unkonw";break;}putText(frame, str, Point(faces[i].x,faces[i].y), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,255,0), 1, 8);}//-- Show what you gotimshow(window_name, frame);}int main(){VideoCapture cap(0);if (!cap.isOpened()){cout << "Fail Open Camera !" << endl;return -1;}String face_cascade_name = "haarcascade_frontalface_alt.xml";String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";if (!face_cascade.load(face_cascade_name)){ cout << "--(!)Error loading" << endl; return -1; };if (!eyes_cascade.load(eyes_cascade_name)){ cout << "--(!)Error loading" << endl; return -1; };FaceTrain();//人脸库训练namedWindow(window_name);bool stop = false;while (!stop){Mat frame;cap >> frame;if (!frame.empty()){detectAndDisplay(frame);}if (waitKey(10) >= 0)stop = true;}return 0;}



0 0
原创粉丝点击