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

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;
}



  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值