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="https://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 person
Mat 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 person
Mat 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 faces
face_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 got
imshow(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 faces
face_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 got
imshow(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;
}