一、人脸检测并采集个人图像

//take_photo.cpp
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std; void take_photo() {
VideoCapture cap(); //打开摄像头
if (!cap.isOpened())
return; //加载级联检测器
CascadeClassifier cascade;
cascade.load("F:/opencv3.2/Release_x64/etc/haarcascades/haarcascade_frontalface_alt_tree.xml"); Mat frame;
vector<Rect>faces;
int count = ;
while (cap.read(frame)) //相当于cap >> frame
{
cascade.detectMultiScale(frame, faces, 1.1, , , Size(, ), Size(, ));//检测是否有人脸
for (int i = ; i < faces.size(); i++)
{
if (count % == ) { //每10帧保存一次人脸图像
Mat dst;
resize(frame(faces[i]), dst, Size(, ));//设置人脸图像大小
cvtColor(dst, dst, COLOR_BGR2GRAY);//转为灰度图节省计算
imwrite(format("att_faces/s41/pic%d.jpg", count / ), dst);
}
rectangle(frame, faces[i], Scalar(, , ));
}
imshow("video", frame); //按下任意键退出摄像头(waitkey在本系统环境下默认为255),或者是保存了20张人脸图片后,退出
if (waitKey() != || count / >)
break;
count++;
}
cap.release();
destroyAllWindows();//关闭所有窗口
}

运行程序,打开摄像头后会自动保存人脸图像,头不要晃动,表情变化即可,对于不合适的照片还需进行筛选。

二、基于特征脸算法的人脸识别

//face_recognition.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp> using namespace cv;
using namespace cv::face;
using namespace std; double face_recognition() {
//读取文件,转换为数据流
string filename = string("at.txt");
ifstream file(filename.c_str(), ifstream::in);
if (!file)
cout << "error" << endl; string line, path, classlabel;
vector<Mat>image;
vector<int>labels;
char separator = ';';
while (getline(file, line))
{
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if (!path.empty() && !classlabel.empty())
{
//cout << "path:" << path<< endl;
image.push_back(imread(path, ));
labels.push_back(atoi(classlabel.c_str()));
}
}
if (image.size() < || labels.size() < )
cout << "invalid image path..." << endl; //最后一个人为测试样本
Mat testSample = image[image.size() - ];
int testLabel = labels[labels.size() - ];
image.pop_back();
labels.pop_back(); //EigenFace算法的模型训练
Ptr<BasicFaceRecognizer>model = createEigenFaceRecognizer();
model->train(image, labels); //对样本进行识别
int predictLabel = model->predict(testSample);
cout << "actual label:" << testLabel << ",predict label:" << predictLabel << endl; //加载级联检测器
CascadeClassifier cascade;
cascade.load("haarcascade_frontalface_alt_tree.xml");//识别时用alt_tree分类器,宁可漏检也不误检 //打开摄像头
VideoCapture cap();
if (!cap.isOpened())
cout << "error..."; Mat frame;
vector<Rect>faces;
int correct = , total = ;
while (cap.read(frame)) //相当于cap >> frame,读取摄像头的每一帧
{
cascade.detectMultiScale(frame, faces, 1.1, , , Size(, ), Size(, ));//检测是否有人脸
for (int i = ; i < faces.size(); i++)
{
Mat roi = frame(faces[i]);
cvtColor(roi, roi, COLOR_BGR2GRAY);
resize(roi, testSample, testSample.size());
int label = model->predict(testSample);
rectangle(frame, faces[i], Scalar(, , ));
if (label == )
{
putText(frame, "ZhangChunFu", faces[i].tl(), FONT_HERSHEY_COMPLEX, 1.0, Scalar(, , ));
correct++;
}
else
putText(frame, format("%d", label), faces[i].tl(), CV_FONT_HERSHEY_SIMPLEX, 0.8, Scalar(, , ));
}
total++;
imshow("人脸识别——MR.Zhang", frame);
if (waitKey() == )
break;
} cap.release();
destroyAllWindows();//关闭所有窗口
waitKey(); double rate = (1.0*correct) / total;
return rate;//返回正确率
}
//main.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
#include <iostream> using namespace cv;
using namespace cv::face;
using namespace std; void take_photo();
double face_recognition(); void main() {
int flag;
double rate;
cout << "欢迎使用人脸识别系统(1代表录入人脸,2代表识别人脸),请输入您的选择:" << endl;
cin >> flag;
cout << "请稍等片刻……"<<endl;
switch (flag)
{
case :take_photo();
return;
case :
rate=face_recognition();
break;
default:
break;
}
cout << "识别率:" << rate << endl;
system("pause"); }

opencv学习之路(41)、人脸识别的更多相关文章

  1. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

  2. OpenCV进阶之路:神经网络识别车牌字符

    1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...

  3. 使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别

    这是一篇国外的文章,介绍如何通过 WebRTC.OpenCV 和 WebSocket 技术实现在 Web 浏览器上的人脸识别,架构在 Jetty 之上. 实现的效果包括: 还能识别眼睛 人脸识别的核心 ...

  4. 用opencv做的静态图片人脸识别

    这次给大家分享一个图像识别方面的小项目,主要功能是识别图像中的人脸并根据人脸在图片库找出同一个与它最相似的图片,也就是辨别不同的人. 环境:VS2013+opencv2.4.13 主要是算法:open ...

  5. 我的opencv之旅:ios人脸识别

    学习opencv有一年多了,这本来是我的毕业设计的一部分,但是因为不能突出专业重点,所以换了个课题. opencv在vc.android.ios下都能用,其中vc和android下的教程和主题贴最多, ...

  6. 可学习的多人人脸识别程序(基于Emgu CV)

    源代码下载(需要安装Emgu CV,安装方法请百度) 很多朋友使用Emgu CV遇到CvInvoke()的报错,我找到一种解决方法. 把EmguCV目录下bin里面的所有dll复制到C:\WINDOW ...

  7. ng-深度学习-课程笔记-14: 人脸识别和风格迁移(Week4)

    1 什么是人脸识别( what is face recognition ) 在相关文献中经常会提到人脸验证(verification)和人脸识别(recognition). verification就 ...

  8. python3+opencv+tkinter开发简单的人脸识别小程序

    学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...

  9. openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)

    原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特 ...

随机推荐

  1. Python---函数的相关知识点总结一:

    1:定义函数 def printInfo(): print("I love Python!") #调用函数 #注意:函数定义完毕并不会被默认执行,只能通过调用的方式来让它执行 pr ...

  2. spark核心优化详解

    大家好!转眼又到了经验分享的时间了.吼吼,我这里没有摘要也没有引言,只有单纯的经验分享,请见谅哦! 言归正传,目前在大数据领域能够提供的核心计算的工具,如离线计算hadoop生态圈的mr计算模型,以及 ...

  3. mysql--表数据操作

    查询: 简单查询 ####查询的字段必须在表中存在 #### 对查询出来的数据进行修改时,不会修改原来的数据,只是修改了可视化的,我们看到的数据. # 查一个数据 select 字段名 from 表名 ...

  4. javascript 的引入

    目录 一.静态引入 1. html标签script引入 2. esm 中import ModuleName from 'module/path' 3. commonjs 中 const ModuleN ...

  5. 学习MySQL过程中的随笔二

    MySQL深入学习:     视图 使用视图的目的:多次使用同一张临时表(或者已经存在的表) 视图只是一个虚拟表,其本质为[根据SQL语句获取动态的数据集,并为其命名],用户只需使用别名即可获得实时的 ...

  6. 创建vs离线安装程序(不联网安装vs)

    https://blog.csdn.net/u013064585/article/details/80996933

  7. 立一个Flag吧

    以后在学习上遇到的问题以及解决办法,大部分都要记录在这里了,以备温故知新....就这样吧!

  8. Oracle 10.2.0.5升级至11.2.0.4

    参照MOS 官方文档Complete Checklist for Manual Upgrade to Oracle Database 11gR2 (11.2) (Doc ID 837570.1)一.升 ...

  9. 异常将上下文初始化事件发送到类的侦听器实例.[org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class p

    严重: 异常将上下文初始化事件发送到类的侦听器实例.[org.springframework.web.context.ContextLoaderListener]org.springframework ...

  10. 北京大学Cousera学习笔记--2-计算导论与C语言基础-第一讲.计算机的基本原理-图灵机

    有限状态读写头从一个初始状态开始,对存储器上的输入数据进行读或写操作,经过有限步操作之后停机,此时存储器上的输出数据就是计算结果 (1) 图灵机的构成: 1.一条存储带:双向无限延长:上有一个个的小方 ...