/*
交互式对话框:请选择要执行的动作1.人脸采集:打开摄像头,采集照片,保存训练模型2.人脸识别:<1>打开摄像头,采集照片,预识别;<2>输入图像的路径,图像识别输出结果:找到匹配的对象,输出名字;未找到匹配的对象,提示:人脸采集并保存训练模型
*/#include <iostream>
#include <fstream>
#include <string>
#include <vector>#include <sys/io.h>#include <sys/stat.h>
#include <unistd.h>
#include <string>
#include <fstream>#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/face.hpp>using namespace std;
using namespace cv;
using namespace cv::face;/*交互式对话框:请选择要执行的动作人脸采集:打开摄像头,采集照片,保存训练模型人脸识别:打开摄像头,采集照片,预识别;输入图像的路径,图像识别输出结果:找到匹配的对象,输出名字;未找到匹配的对象,提示:人脸采集并保存训练模型
*/
int  face_image_save(string dir_name, string cascade_path);
int face_model_train_save(string cvs_path);
int face_recg(Mat image, string cascade_path);
//void read_cvs(const string& filename, vector<Mat>& img, vector<int>& lable, char separator = ';');
//void write_cvs(string& filename, string line, int label_number, char separator = ';');string cascade_xml_path = "F:\\project\\vs2017\\openCV_test\\openCV_test\\cascade\\haarcascades\\haarcascade_frontalface_default.xml";
string face_image_path = "F:\\project\\vs2017\\openCV_test\\openCV_test\\face_recg\\face\\";
string cvs_path = "F:\\project\\vs2017\\openCV_test\\openCV_test\\face_recg\\face\\at.txt";int label_number = 100;#define  MY_SIZE  Size(92, 112)int main()
{while (true){printf("\n<------------------ Welcome to face recognition system, please enter your choice ------------------>\n -- Face image acquisition\n -- face recognition\n -- Exit\n");int action = 0;cin >> action;if (action == 1){printf("Please input your name:");string name;cin >> name;string dir_name = face_image_path + name + "\\";int ret = face_image_save(dir_name, cascade_xml_path);if (ret == 0){face_model_train_save(cvs_path);}}else if (action == 2){printf("\n\n请选择图片来源:\n1 -- 从指定目录选择图片\n2 -- 打开摄像头读取图片\n");cin >> action;Mat test_img;switch (action){case 1:{printf("请输入图片的完整路径\n");string img_path;while (true){cin >> img_path;if (access(img_path.c_str(), 0) == -1){printf("没有找到图片,请重新选择图片!!!\n");}else{test_img = imread(img_path.c_str());break;}}}break;case 2: default:{printf("请对准摄像头,我们将读取照片...\n");//打开摄像头VideoCapture capture;capture.open(0);if (!capture.isOpened()){printf("Can't open camera...\n");return -1;}capture.read(test_img);capture.release();}break;}//人脸识别face_recg(test_img, cascade_xml_path);}else{break;}}return 0;
}//使用CVS文件读取图片和标签
void read_cvs(const string& filename, vector<Mat>& img, vector<int>& lable, char separator = ';')
{Mat tmp_img;ifstream cvs_file(filename.c_str());assert(cvs_file);string line, path, tag;while (getline(cvs_file, line)){stringstream lines(line);getline(lines, path, separator);getline(lines, tag);if (!path.empty() && !tag.empty()){tmp_img = imread(path, IMREAD_GRAYSCALE);   //读入图像时转成灰度图assert(!tmp_img.empty());img.push_back(tmp_img);lable.push_back(atoi(tag.c_str()));}}tmp_img.release();
}void write_cvs(string& filename, string line, int label_number, char separator = ';')
{ofstream cvs_file;string str = line + separator + format("%d\n", label_number);//printf("%s\n", str.c_str());cvs_file.open(filename.c_str(), ios::app);if (cvs_file.is_open()){cvs_file << str;cvs_file.close();}
}int  face_image_save(string dir_name, string cascade_path)
{//printf("我们将保存你的图片到以下路径:%s\n", dir_name.c_str());if (access(dir_name.c_str(), 0) == -1){//printf("不存在文件夹,我们将创建...\n");mkdir(dir_name.c_str(),S_IRWXU|S_IRGRP|S_IROTH);}else{printf("人脸图片已经保存在数据库,不需要重复读取\n");return -1;}VideoCapture capture;//打开笔记本摄像头capture.open(0);if (!capture.isOpened()){printf("can't open camera...\n");return -1;}//加载分类器CascadeClassifier cascade;cascade.load(cascade_path);if (cascade.empty()){printf("can't load classifier\n");return -1;}Mat img, img_gray, faceROI;vector<Rect> faces;int count = 0;string my_path, tmp_path;while (true){capture.read(img);  cvtColor(img, img_gray, COLOR_RGB2GRAY);    //转化为灰度图equalizeHist(img_gray, img_gray);       //直方图均衡化cascade.detectMultiScale(img_gray, faces, 1.1, 6, 0, Size(30, 30)); //人脸识别,获取faces矢量数据集if (faces.size() > 0){for (int i = 0; i < faces.size(); ++i){                faceROI = img_gray(faces[i]);//ROI部分为将要保存的图片,用img_gray获取灰度图部分,保存成灰度图;如果将img_gray改为img,就变成彩色图片了resize(faceROI, faceROI, MY_SIZE);   //调整ROI图片大小到指定大小rectangle(img, faces[i], Scalar(0, 255, 0), 2, 8, 0);imshow("view", img); //显示视频图像imshow("ROI", faceROI);   //显示ROI区域tmp_path = format("%d.jpg", count++);my_path = dir_name + tmp_path;imwrite(my_path, faceROI);       //保存采集到的图片到指定目录write_cvs(cvs_path, my_path, label_number);}}if (waitKey(30) == 27 || count == 20){break;}}//保存的标签值label_number++;capture.release();destroyAllWindows();return 0;
}int face_model_train_save(string cvs_path)
{printf("创建人脸识别的模型并进行训练,保存训练结果中(需要一些时间)...\n");vector<Mat> faces;vector<int> labels;try{read_cvs(cvs_path, faces, labels);}catch (Exception &e){cerr << "Error opening file, reason :" << e.msg << endl;return -1;}if (faces.size() <= 1){printf("Too few face images\n");return -1;}/* 创建人脸识别的模型,并进行训练,之后保存训练结果*/double start1, start2, start3;double end1, end2, end3;//PCA特征脸算法start1 = (double)getTickCount();Ptr<EigenFaceRecognizer> eigen_model = EigenFaceRecognizer::create();eigen_model->train(faces, labels);eigen_model->save("my_eigen_face_model.xml");end1 = (getTickCount() - start1) / getTickFrequency();//LDA线性判别分析start2 = (double)getTickCount();Ptr<FisherFaceRecognizer> fisher_model = FisherFaceRecognizer::create();fisher_model->train(faces, labels);fisher_model->save("my_fisher_face_model.xml");end2 = (getTickCount() - start2) / getTickFrequency();//LBP局部二值模式直方图start3 = (double)getTickCount();Ptr<LBPHFaceRecognizer> lbph_model = LBPHFaceRecognizer::create();lbph_model->train(faces, labels);lbph_model->save("my_lbph_face_model.xml");end3 = (getTickCount() - start3) / getTickFrequency();printf("PAC算法训练所用时间: %f s\n", end1);printf("LDA算法训练所用时间:    %f s\n", end2);printf("LBP算法训练所用时间:    %f s\n", end3);printf("训练结束,保存成功!\n");return 0;
}int face_recg(Mat image, string cascade_path)
{printf("人脸识别中...\n");//显示读入的图片imshow("origin", image);waitKey(30);//加载分类器CascadeClassifier cascade;cascade.load(cascade_path);if (cascade.empty()){printf("can't load classifier\n");return -1;}//读取人脸识别模型double start1, start2, start3;double end1, end2, end3;start1 = (double)getTickCount();Ptr<EigenFaceRecognizer> eigen_model = Algorithm::load<EigenFaceRecognizer>("my_eigen_face_model.xml"); //Eigen Faces算法end1 = (getTickCount() - start1) / getTickFrequency();start2 = (double)getTickCount();Ptr<FisherFaceRecognizer> fisher_model = Algorithm::load<FisherFaceRecognizer>("my_fisher_face_model.xml");//Fisher Faces算法end2 = (getTickCount() - start2) / getTickFrequency();start3 = (double)getTickCount();Ptr<LBPHFaceRecognizer> lbph_model = Algorithm::load<LBPHFaceRecognizer>("my_lbph_face_model.xml");     //LBP 算法end3 = (getTickCount() - start3) / getTickFrequency();printf("加载PAC算法训练模型所用时间: %f s\n", end1);printf("加载LDA算法训练模型所用时间:    %f s\n", end2);printf("加载LBP算法训练模型所用时间:    %f s\n", end3);Mat faceROI, img_gray;int p_label;vector<Rect> faces;cvtColor(image, img_gray, COLOR_RGB2GRAY);   //转化为灰度图equalizeHist(img_gray, img_gray);       //直方图均衡化cascade.detectMultiScale(img_gray, faces, 1.1, 6, 0, Size(30, 30)); //人脸识别,获取faces矢量数据集//printf("size = %zd\n", faces.size());if (faces.size() > 0){for (int i = 0; i < faces.size(); ++i){faceROI = img_gray(faces[i]);resize(faceROI, faceROI, MY_SIZE);  //调整成训练集一样的大小rectangle(image, faces[i], Scalar(0, 255, 0), 2, 8, 0);imshow("Origin", image);p_label = eigen_model->predict(faceROI);cout << "Eigen算法识别到的结果:" << p_label << endl;p_label = fisher_model->predict(faceROI);cout << "Fisher算法识别到的结果:" << p_label << endl;p_label = lbph_model->predict(faceROI);cout << "LBPH算法识别到的结果:" << p_label << endl;imshow("result", faceROI);}}destroyAllWindows();return 0;
}

人脸识别摄像头采集数据训练相关推荐

  1. 人脸识别(二)——训练分类器

    上一篇简单整理了下人脸识别的相关基础知识,这一篇将着重介绍利用pencv(2.4.9)已有的模型进行分类器训练. 一.关于ORL人脸数据库 ORL是一个40个人,每人采取10张人脸头像构成的一个人脸数 ...

  2. “3.15”曝光的人脸识别摄像头,错在用错了场所

    今年的"3.15"官方定的主题是"提振消费 从心开始",但被曝光的热点却是"消费者隐私安全",当然,那些明显存在产品质量的,黑心的商贩的事年 ...

  3. OpenCV3实现人脸识别(三)——训练与识别自己的人脸数据

    前言 1.前面已经演示过使用OpenCV官方分类器实现人脸检测并拍照下要用来训练人脸识别的样本数据,并生成包含有人脸样本的列表文件(.txt)文件. 2.我的编程环境是Windows 7 64位,ID ...

  4. Python-中北大学人工智能OpenCV人脸识别(根据图片训练数据,根据训练好的数据识别人脸)

    文章目录 1. 根据训练照片训练数据模型 2. 根据训练的数据文件,进行人脸识别 1. 根据训练照片训练数据模型 训练流程: 读取文件夹下的所有文件,使用PIL 库中的Image方法打开图片,并将其转 ...

  5. 315 曝光人脸识别摄像头,进店瞬间偷走你的“脸”,自动分析心情

    整理 | AI科技大本营(ID:rgznai100) 近几年来,人脸识别给我们生活带来众多便利:手机开机刷脸,坐火车刷脸进站,购物刷脸支付--然而有人正一声不吭偷走你的"脸". 3 ...

  6. 人脸识别保存在mysql_人脸识别后的数据存储在哪里?

    最近在某个项目里接触到人脸方案,那目前国内的通常处理方案还是基于文件夹和文件管理:基本上不会太多的考虑安全方面的问题: 也就是说,其实可以理解成任何一个具有电脑和设备操作权限的人都可以随意复制这些数据 ...

  7. 机器学习之人脸识别人像采集

    随着机器学习和深度学习的广泛应用,改变了人们的生活方式.下面我们使用python实现人像的采集.下一篇讲述人脸识别. 这里通过usb接口的摄像头为例. 首先我们需要导入cv2模块,获取人脸识别分类器, ...

  8. 人脸检测(二)--人脸识别样本制作及训练测试

    闲得没事,折腾下opencv 人脸识别,从样本制作到评估. 1.直接copy opencv里的源码,创建工程,添加opencv库,可以直接cmake源码,但我之所以自己创建工程,是想多学习,并且降低与 ...

  9. 人脸识别之人脸检测(二)--人脸识别样本制作及训练测试

    原文:https://blog.csdn.net/app_12062011/article/details/51422604 闲得没事,折腾下opencv 人脸识别,从样本制作到评估. 1.直接cop ...

最新文章

  1. python从小到大的顺序输出-python从小到大的顺序输出
  2. Map 和 WeakMap
  3. jwt token 附加用户信息_获取jwt(json web token)中存储的用户信息
  4. seq2seq模型_用 CNN 实现 Seq2Seq 模型
  5. 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
  6. GB35114---SM3withSM2证书生成及读取(二)
  7. HTML5中 audio标签的样式修改
  8. 四十八种微信公众号加人方法
  9. 推广引流方法有哪些方式,平台有哪些?各平台引流方法分析!
  10. js转换Date日期格式
  11. 举个栗子!Tableau 技巧(89):如何在 Tableau 官网提交 Case
  12. 用友U8V系统怎么重启服务器,用友u8怎么重启云服务器
  13. 从零开始开发SSM项目-博客系统实战
  14. HTML input 输入限制
  15. H5-脱机API-Application Cache-1.1
  16. 系统弱密码检查John
  17. Linux Deepin 输入法缩放折腾问题-装个搜狗就完事了
  18. sqlserver数据库,使用substring函数截取不固定位置字符串。
  19. 大数据时代-使用关系型数据库的价值意义?
  20. EDT技术 ug - 第一章节 Getting Start

热门文章

  1. Python+scrapy爬取36氪网
  2. conda 安装tensorboardX
  3. C#如何按帧截取视频,并保存为图片
  4. 无线互动会议室方案-圆桌会议
  5. 维谛技术(Vertiv):场景驱动的边缘计算
  6. 运用STM32对SD卡数据读取
  7. frp内网穿透工具使用
  8. 正则表达式,终极使用!3个工具,搞定一切
  9. 小程故事多 | 看来微服务就是一把双刃剑
  10. 如何写好方案规划设计文档,这里有一份实践清单