#include "FaceRecognition.h"
using namespace cv;
using namespace std;
using namespace face;
CFaceRecognition::CFaceRecognition()
{
}
CFaceRecognition::~CFaceRecognition()
{
}
BOOL CFaceRecognition::Train(LPCTSTR path, LPCTSTR fName)
{
char buffer[MAX_PATH];
_getcwd(buffer, MAX_PATH);//获取当前路径
// printf("The current directory is: %s ", buffer);
string fn_csv; //读取文件的绝对路径
fn_csv = buffer;
fn_csv = fn_csv + path;
//string fn_csv = "C:\\Users\\Administrator\\Desktop\\face\\Train\\FaceTest\\image\\at.txt";//读取你的CSV文件路径.
//string fn_csv = "./image/at.txt";//读取你的CSV文件路径. 相对路径读取失败
vector<Mat> images;// 2个容器来存放图像数据和对应的标签
vector<int> labels;
if (images.size())
{
return FALSE;
}
read_csv(fn_csv, images, labels);//从csv文件中批量读取训练数据
Ptr<FaceRecognizer>model = createEigenFaceRecognizer();
model->train(images, labels);
model->save(fName);//保存路径
return TRUE;
}
BOOL CFaceRecognition::LoadClassifier(LPCTSTR fName)
{
if (!m_FaceCascades.load("haarcascade_frontalface_alt.xml"))
return FALSE;
m_model = createEigenFaceRecognizer();
m_model->load(fName);
return TRUE;
}
BOOL CFaceRecognition::FaceDetect(cv::Mat srcImage,int Label, LPCTSTR szName, LPCTSTR wdNmae, int WaiteKey)
{
std::vector<Rect> faces; //存储人脸的矩形
Mat edges;
Mat frame_gray;
if (srcImage.channels() == 1)
{
frame_gray = srcImage;
}
else
{
cvtColor(srcImage, frame_gray, CV_RGB2GRAY);
}
equalizeHist(frame_gray, frame_gray); //直方图均衡化
m_FaceCascades.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));//寻找人脸
if (!faces.size())
{
imshow(wdNmae, srcImage);
waitKey(WaiteKey);
return FALSE;
}
Mat* pImage_roi = new Mat[faces.size()]; //定以人脸图像数组
// string str;
for (int i = 0; i < faces.size(); i++)
{
pImage_roi[i] = frame_gray(faces[i]); //将所有的脸部保存起来
if (pImage_roi[i].empty())
{
delete[]pImage_roi;
return FALSE;
}
if (Predict(pImage_roi[i]) == Label) //每张图片进行识别
{
Scalar color = Scalar(m_rng.uniform(0, 255), m_rng.uniform(0, 255), m_rng.uniform(0, 255));//所取的颜色任意值
rectangle(srcImage, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), color, 1, 8);//放入缓存
putText(srcImage, szName, Point(faces[i].x, faces[i].y), FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));//添加文字
}
}
delete[]pImage_roi;
imshow(wdNmae, srcImage);
waitKey(WaiteKey);
return TRUE;
}
void CFaceRecognition::read_csv(const std::string & filename, std::vector<cv::Mat>& images, std::vector<int>& labels, char separator)
{
std::ifstream file(filename.c_str(), ifstream::in);//c_str()函数可用可不用,无需返回一个标准C类型的字符串
if (!file) {
string error_message = "No valid input file was given, please check the given filename.";
CV_Error(CV_StsBadArg, error_message);
}
string line, path, classlabel;
while (getline(file, line))//从文本文件中读取一行字符,未指定限定符默认限定符为“/n”
{
stringstream liness(line);//这里采用stringstream主要作用是做字符串的分割
getline(liness, path, separator);//读入图片文件路径以分好作为限定符
getline(liness, classlabel);//读入图片标签,默认限定符
if (!path.empty() && !classlabel.empty())//如果读取成功,则将图片和对应标签压入对应容器中
{
images.push_back(cv::imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
}
基于opencv人脸识别的封装
需积分: 50 173 浏览量
2017-12-02
16:25:51
上传
评论 2
收藏 4.5MB RAR 举报
古天九等一缕
- 粉丝: 103
- 资源: 5