opencv学习笔记六十七:LBPH人脸识别算法

简要: 

LBPH(Local Binary PatternsHistograms)局部二进制编码直方图,建立在LBPH基础之上的人脸识别法基本思想如下:首先以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;再将LBP图像分为个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图,通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。

#include<opencv2\opencv.hpp>
#include<opencv2\face.hpp>
using namespace cv;
using namespace face;
using namespace std;
char win_title[40] = {};

int main(int arc, char** argv) { 
	//namedWindow("input",CV_WINDOW_AUTOSIZE);

	//读入模型需要输入的数据,用来训练的图像vector<Mat>images和标签vector<int>labels
	string filename = string("path.txt");
	ifstream file(filename);
	if (!file) { printf("could not load file"); }
	vector<Mat>images;
	vector<int>labels;
	char separator = ';';
	string line,path, classlabel;
	while (getline(file,line)) {
		stringstream lines(line);
		getline(lines, path, separator);
		getline(lines, classlabel);
		//printf("%d\n", atoi(classlabel.c_str()));
		images.push_back(imread(path, 0));
		labels.push_back(atoi(classlabel.c_str()));//atoi(ASCLL to int)将字符串转换为整数型
	}
	int height = images[0].rows;
	int width = images[0].cols;
	printf("height:%d,width:%d\n", height, width);
	//将最后一个样本作为测试样本
	Mat testSample = images[images.size() - 1];
	int testLabel = labels[labels.size() - 1];
	//删除列表末尾的元素
	images.pop_back();
	labels.pop_back();
	
	//加载,训练,预测
	Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();
	model->train(images, labels);
	int predictedLabel = model->predict(testSample);
	printf("actual label:%d,predict label :%d\n", testLabel, predictedLabel);

	int radius = model->getRadius();
	int neibs = model->getNeighbors();
	int grad_x = model->getGridX();
	int grad_y = model->getGridY();
	double t = model->getThreshold();
	printf("radius:%d\n", radius);
	printf("neibs:%d\n", neibs);
	printf("grad_x:%d\n", grad_x);
	printf("grad_y:%d\n", grad_y);
	printf("threshold:%.2f\n", t);

	waitKey(0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82893247