(八)OpenCV人脸识别_06_LBPH算法

  1. 基本流程:
    输入人脸->人脸数据表示->LBPH特征提取+人脸图像与特征数据库->分类识别->识别人脸
  2. LBPH算法:
    图像灰度化->LBP特征提取->ULBP降维处理->分割为多个方格(Cell)->每个方格生成直方图->直方图链接,特征向量集合->与DB中直方图比较(直方图比较)->得到分类结果
Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();
#include 
#include 
#include 

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

//OpenCV人脸识别https://www.cnblogs.com/guoming0000/archive/2012/09/27/2706019.html
int main(int argc, char** argv)
{
	String filename = string("face_image.txt");//标签Label_Text文件
	//从硬盘到内存
	ifstream file(filename.c_str(), ifstream::in);////c_str()函数可用可不用,无需返回一个标准C类型的字符串
	if (!file)//打开标签文件失败
	{
		cout << "could not load label_file" << endl;
		return -1;
	}

	string line, path, classlabel;
	vector<Mat> images;//存放图像数据
	vector<int> labels;//存放图像标签
	char separator = ';';//分号

	while (getline(file, line)) //getline(cin,inputLine)//cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称
	{
		stringstream liness(line);//这里采用stringstream主要作用是做字符串的分割
		getline(liness, path, separator);//遇到分号就结束
		getline(liness, classlabel);//继续从分号后面开始,遇到换行结束
		if (!path.empty() && !classlabel.empty())
		{
			images.push_back(imread(path, 0));//imread(path,0)//0不能去
			labels.push_back(atoi(classlabel.c_str()));//atoi字符串转换成整型数
		}
	}

	if (images.size() <= 1 || labels.size() <= 1)//如果没有读到足够多的图片
	{
		cout << "读取图片数据失败..." << endl;
	}

	int height = images[0].rows; //得到第一张图片的高度,在下面对图像变形得到他们原始大小时需要
	int width = images[0].cols;
	cout << "读取的图片高度为:" << height << endl << "读取的图片宽度为:" << width << endl;

	//从数据集 中移除最后一张图片,用于做测试,需要根据自己的需要进行修改
	Mat testSample = images[images.size() - 2];//获取最后一张照片
	int testLabel = labels[labels.size() - 2];//获取最后一个标签
	images.pop_back();//移除最后一张图片
	labels.pop_back();//移除最后一个标签

	//lbphfaces
	Ptr<LBPHFaceRecognizer> model = LBPHFaceRecognizer::create();
	model->train(images, labels);

	//对测试图像进行预测,predictedLabel是预测标签结果
	int predictedLabel = model->predict(testSample);
	cout << "actual label:	" << testLabel << endl;
	cout << "predict label:	" << predictedLabel << endl;
	
	//输出LBPH算法参数
	cout << "radius:	" << model->getRadius()		<< endl;//中心像素点到周围像素点的距离
	cout << "neighb:	" << model->getNeighbors()	<< endl;//周围像素点的个数
	cout << "grid_x:	" << model->getGridX()		<< endl;//将一张图片在x方向分成几块
	cout << "grid_y:	" << model->getGridY()		<< endl;//将一张图片在y方向分成几块
	cout << "thresh:	" << model->getThreshold()	<< endl;//相似度阈值

	//样本的直方图的长度
    vector<Mat> histograms = model->getHistograms();
    cout <<"Size of the histograms: "<< histograms[0].total()<< endl;

	waitKey(0);
	return 0;
}

输出结果:
(八)OpenCV人脸识别_06_LBPH算法_第1张图片

你可能感兴趣的:(笔记,Opencv)