您的位置:首页 > 运维架构

Opencv LBPH人脸识别算法详解

2019-05-21 07:07 1721 查看

简要: 

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

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

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: