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;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 Opencv LBPH人脸识别算法详解 的全部内容, 来源链接: utcz.com/p/244453.html

回到顶部