opencv学习之路(41)、人脸识别
一、人脸检测并采集个人图像

//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)、人脸识别的更多相关文章
- opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH
一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...
- OpenCV进阶之路:神经网络识别车牌字符
1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...
- 使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别
这是一篇国外的文章,介绍如何通过 WebRTC.OpenCV 和 WebSocket 技术实现在 Web 浏览器上的人脸识别,架构在 Jetty 之上. 实现的效果包括: 还能识别眼睛 人脸识别的核心 ...
- 用opencv做的静态图片人脸识别
这次给大家分享一个图像识别方面的小项目,主要功能是识别图像中的人脸并根据人脸在图片库找出同一个与它最相似的图片,也就是辨别不同的人. 环境:VS2013+opencv2.4.13 主要是算法:open ...
- 我的opencv之旅:ios人脸识别
学习opencv有一年多了,这本来是我的毕业设计的一部分,但是因为不能突出专业重点,所以换了个课题. opencv在vc.android.ios下都能用,其中vc和android下的教程和主题贴最多, ...
- 可学习的多人人脸识别程序(基于Emgu CV)
源代码下载(需要安装Emgu CV,安装方法请百度) 很多朋友使用Emgu CV遇到CvInvoke()的报错,我找到一种解决方法. 把EmguCV目录下bin里面的所有dll复制到C:\WINDOW ...
- ng-深度学习-课程笔记-14: 人脸识别和风格迁移(Week4)
1 什么是人脸识别( what is face recognition ) 在相关文献中经常会提到人脸验证(verification)和人脸识别(recognition). verification就 ...
- python3+opencv+tkinter开发简单的人脸识别小程序
学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...
- openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)
原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特 ...
随机推荐
- Enable Coded UI Testing of Your Controls
http://msdn.microsoft.com/en-us/library/hh552522.aspx AccessibleObject Class http://msdn.microsoft.c ...
- go 并发编程(1)
优雅的并发编程范式,完善的并发支持,出色的并发性能是go语言区别于其他语言的一大特色. 1.并发基础 win和linux 出现之前,程序员并没有并发的概念.因为命令式程序设计语言是以串行为基础的,程序 ...
- Linux下查找某一文件常用的方式
当我们需要在ubuntu中找到之前的某一个文件,该用什么方式呢?用以下命令你就可以快速定位: find / -name "pycharm.sh" 用find查找这个命令,确定查找范 ...
- Install VirtualBox Guest Additions for elementary os
Pls refer to: Install VirtualBox Guest Additions for elementary os
- 【C++】链表回环检测
//链表回环检测问题 #include<iostream> #include<cstdlib> using namespace std; ; struct node { int ...
- keras,tensorflow,numpy,jupyter
docker-tensorflow:https://segmentfault.com/a/1190000015053704 pip install scipy pip install keras do ...
- cadence16.6 暴力破解出现再次安装出现问题为Sever-----------问题
根据本人,实测,本人研究几天和在网络上借鉴,此方法是几天的成果,如有借鉴,请说明出处,谢谢,不懂的请留言. 最优解决方式,是自己卸载软件,有人会说,都完全删除了还怎么卸载软件. (1)在安装包里有个注 ...
- 3n+1猜想——模拟
package dxb.com; import java.util.Scanner; public class caixiang { public static void main(String[] ...
- #学号 20175201张驰 《Java程序设计》第3周学习总结
学号 20175201张驰 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 每个源文件里可以包含多个类,但只能有1个主类:类中可以包含变量和方法 变量有两种:实例变量和类变量 ...
- 关闭 synactive guixt. 在sap gui的右上角一个标志里,将 active guixt 选项去掉即可。
关闭 synactive guixt. 在sap gui的右上角一个标志里,将 active guixt 选项去掉即可.