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

//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. 几个bat文件(关于robot freamwork安装)

    如果安装后 没有这几文件,或者在运行后 提示 文件缺少这个文件 , 就需要手动创建.   一般文件在 :C:\Python27\Scripts 这个目录下 1.pybot.bat文件: @echo o ...

  2. JAVA RPC (五) 之thrift序列化RPC消息体

    让大家久等了.继续更新thrift序列化的消息体,下面我们一步一步的看一看thrift的rpc是怎么实例化消息体的. 首先我们先准备一个request文件 namespace java bky str ...

  3. bug和注意事项

    bug: 1.新增角色,在选择权限树的时候,如果不选择根目录下的第一个节点,保存后,权限树会打不开. 2.文档页面有两个大字段,即ueditor编辑器的时候,保存后回显会有问题 不过一个页面有两个大文 ...

  4. 如何让模拟的json数据接口能够正常的在手机上有效果

    1. 确保手机与PC在同一个ip网下 这里我是通过------------360随身WIFI,20块钱淘宝上卖的,外观像U盘一样的,直接插在电脑的USB上就能在PC上创建一个WiFi,手机连接上就可以 ...

  5. MongoDB - 2

    Aggregation Framework: $project: a document stream by renaming, adding, or removing fields #alter Da ...

  6. dvi文件和将dvi文件转换成pdf格式

    dvi文件和将dvi文件转换成pdf格式 Latex只能把tex文件编译成dvi文件, 在cmd 中: 使用xdvi查看dvi格式的文件 若用texstudio编辑tex文件,则可直接将已编译成功的. ...

  7. C#返回JSON格式数据

    又类的属性生成json格式数据 using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  8. OO第一次博客

    过去的三周里我们完成了表达式求导的程序设计与构造.表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入.求导运算和输出功能.可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果.总 ...

  9. CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒

    问题: CLR 无法从 COM 上下文 0x208f68 转换为 COM 上下文 0x2090d8,这种状态已持续 60 秒.拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Wind ...

  10. Python语言——基础02-变量、运算符

    开篇导言: 今天开始进行python学习的笔记更新,以后我都用截图的方式更新,方便不麻烦,界面美观,今天学习更新的python学习内容是环境变量.运算符的内容 关注我博客的童鞋从现在开始也可以跟着我的 ...