利用opencv自带库进行人脸检测与识别

opencv3.2+contrib 利用自带人脸检测库检测与识别人脸

头文件face-recognize.h:

#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
#include <iostream>
#include <string>

using namespace cv;
using namespace cv::face;
using namespace std;

class face_recognizer {
	string base_dir;
	string index_filename;
	string recognizer_filename;
	string face_detector_filename;

private:
	Ptr<LBPHFaceRecognizer> model;

public:
	face_recognizer();

	~face_recognizer();

	Ptr<LBPHFaceRecognizer> getModel() {
		return model;
	}

	int face_train();
	int face_detect(Mat & src, Mat & dst);
	int face_add(Ptr<LBPHFaceRecognizer> model, Mat image, string name, int label);
	int face_recognize(string srcDir);

};

C++文件:

#include "face-recognize.h"


face_recognizer::face_recognizer() {
	base_dir = "C:/develop/idress/model_face_recognize/";
	index_filename = base_dir + "data/image_index.csv";
	recognizer_filename = base_dir + "data/faceModel.xml";
	face_detector_filename = base_dir + "data/haarcascade_frontalface_alt.xml";
	//model = createLBPHFaceRecognizer(1, 8, 8, 8, 50.0);
	model = createLBPHFaceRecognizer();
	model->load(recognizer_filename);
	
}

face_recognizer::~face_recognizer(){}

int face_recognizer::face_recognize(string srcDir) {

	//int new_face_id = 5;

	// 训练出自己的级联分类器
	//face_train();

	//创建识别器
	//Ptr<LBPHFaceRecognizer> model = createLBPHFaceRecognizer(1, 8, 8, 8, 50.0);
	//Ptr<LBPHFaceRecognizer> model = createLBPHFaceRecognizer();

	//加载已有的分类器文件
	//model->load(recognizer_filename);

	Ptr<LBPHFaceRecognizer> model = this->getModel();

	//准备待检测的人脸图片
	Mat src, dst,gray;
	src = imread(srcDir);
	if (face_detect(src, dst) < 0) {
		printf(" no face\n");
		return -1;
	}
	cvtColor(dst, gray, COLOR_BGR2GRAY);

	//识别
	int predictedLabel = -1;
	double predicted_confidence = 0.0;
	model->predict(gray, predictedLabel, predicted_confidence);

	if (predictedLabel < 0 ) {   //或predicted_confidence>50
		//未识别用户,返回最近似的人脸
		//face_add(model, src, to_string(new_face_id), new_face_id);

	}
	else {
		printf(" predict label :  %d\n", predictedLabel);
	}
	
	waitKey(0);
	return 0;

}


int face_recognizer::face_detect(Mat & src, Mat & dst) {
	Mat gray;
	//imshow("src image", src);
	cvtColor(src, gray, COLOR_BGR2GRAY);
	equalizeHist(gray, gray);

	vector<Rect> faces;
	CascadeClassifier face_detector;

	if (!face_detector.load(face_detector_filename)) {
		printf("could not load face feature data...\n");
		return -1;
	}

	face_detector.detectMultiScale(gray, faces, 1.3, 5, 0, Size(24, 24));

	if (faces.size() == 0) {
		return -1;
	}
	for (size_t t = 0; t < faces.size(); t++) {
		//Mat dst;
		rectangle(src, faces[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);
		resize(src(faces[t]), dst, Size(128, 128));
		//imwrite("C:/develop/idress/model_face_recognize/face_store/" + name, dst);
	}

	//imshow("detect faces", dst);
	//waitKey(0);
	return 0;
}


int face_recognizer::face_train() {
	ifstream file(index_filename.c_str(), ifstream::in);
	if (!file) {
		printf("could not load file correctly...\n");
		return -1;
	}

	string line, path, classlabel;
	vector<Mat> images;
	vector<int> labels;
	char separator = ';';
	while (getline(file, line)) {
		stringstream liness(line);
		getline(liness, path, separator);
		getline(liness, classlabel);
		if (!path.empty() && !classlabel.empty()) {
			images.push_back(imread(path, 0));
			labels.push_back(atoi(classlabel.c_str()));
		}
	}

	if (images.size() < 1 || labels.size() < 1) {
		printf("invalid image path...\n");
		return -1;
	}

	// train it
	//Ptr<BasicFaceRecognizer> model = createEigenFaceRecognizer();
	Ptr<LBPHFaceRecognizer> model = createLBPHFaceRecognizer();

	model->train(images, labels);
	model->save(recognizer_filename);

	return 0;
}


int face_recognizer::face_add(Ptr<LBPHFaceRecognizer> model, Mat image, string name, int label) {

	//更新识别器,保存分类器文件
	vector<Mat> images;
	vector<int> labels;
	Mat grayImage;
	cvtColor(image, grayImage, CV_BGR2GRAY);
	images.push_back(grayImage);
	labels.push_back(label);
	model->update(images, labels);
	model->save(recognizer_filename);

	//将图片保存至人脸库,并更新标签列表
	ofstream ofile;
	ofile.open(index_filename, ios::app);
	//ofile << face_store_dir + name << ".PNG;" << label << endl;

	//imwrite(face_store_dir + name+".PNG", image);


	ofile.close();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/pacificyang/article/details/81536291