OpenCV人脸识别之三:识别自己的脸

本系列博客介绍使用OpenCV2进行人脸识别,包括数据收集、预处理、模型训练等步骤。本文将整合前面的内容,通过打开摄像头,加载人脸检测器和模型,实时检测并识别出人脸,特别是当检测到的是作者自己的脸时,会在屏幕上显示作者的名字。
北京 | 高性能计算之GPU CUDA课程11月24-26日 3天密集学习 快速带你晋级 阅读全文 >


本系列人脸识别文章用的是opencv2,最新版的opencv3.2的代码请参考文章:

OpenCV之识别自己的脸——C++源码放送(请在上一篇文章末尾查看)


在之前《OpenCV人脸识别之一:数据收集和预处理》《OpenCV人脸识别之二:模型训练》两篇博客中,已经把人脸识别的整个流程全部交代清楚了。包括今天这篇人脸识别方面的内容都已经在上述第二篇博客中的代码中有所体现。只是今天的内容会让结果更加的形象化。仅此而已。可以说,本篇的内容是前面诸多内容的一个整合。所以今天的内容也很简洁。


简单说下流程

1、打开摄像头。

2、加载人脸检测器,加载人脸模型。

3、人脸检测

4、把检测到的人脸与人脸模型里面的对比,找出这是谁的脸。

5、如果人脸是自己的,显示自己的名字。


代码


#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{    
VideoCapture cap(0);    
//打开默认摄像头    
if (!cap.isOpened())    
{        
return -1;  
 }    
Mat frame;    
Mat edges;  
 Mat gray;    
CascadeClassifier cascade;    
bool stop = false;    
//训练好的文件名称,放置在可执行文件同目录下    cascade.load("haarcascade_frontalface_alt.xml");    
Ptr<FaceRecognizer> modelPCA = createEigenFaceRecognizer();    
modelPCA->load("MyFacePCAModel.xml");    
while (!stop)    
{        
cap >> frame;        

//建立用于存放人脸的向量容器      
vector<Rect> faces(0);        
cvtColor(frame, gray, CV_BGR2GRAY);        
//改变图像大小,使用双线性差值        
//resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);        
//变换后的图像进行直方图均值化处理        
equalizeHist(gray, gray);        
cascade.detectMultiScale(gray, faces,            
1.1, 2, 0          
 //|CV_HAAR_FIND_BIGGEST_OBJECT            
//|CV_HAAR_DO_ROUGH_SEARCH          
 | CV_HAAR_SCALE_IMAGE,            
Size(30, 30));        
Mat face;        
Point text_lb;      
 for (size_t i = 0; i < faces.size(); i++)        
{          
 if (faces[i].height > 0 && faces[i].width > 0)          
 {                
face = gray(faces[i]);                
text_lb = Point(faces[i].x, faces[i].y);                
rectangle(frame, faces[i], Scalar(255, 0, 0), 1, 8, 0);            
}        
}        
Mat face_test;      
 int predictPCA = 0;        
if (face.rows >= 120)        
{          
 resize(face, face_test, Size(92, 112));        
}        
//Mat face_test_gray;        
//cvtColor(face_test, face_test_gray, CV_BGR2GRAY);        
if (!face_test.empty())        
{          
 //测试图像应该是灰度图            
predictPCA = modelPCA->predict(face_test);        
}        
cout << predictPCA << endl;      
 if (predictPCA == 40)      
 {            
string name = "LiuXiaoLong";          
 putText(frame, name, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));      
 }        
imshow("face", frame);
if (waitKey(50) >= 0)            
stop = true;    
}    
return 0;
 }


效果图:



原文链接:http://www.jianshu.com/p/0514c03e6727
作者公众号CVPy,专注于分享OpenCV和Python的实战内容,欢迎关注。


查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”:

www.leadai.org


请关注人工智能LeadAI公众号,查看更多专业文章


大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础


点击“阅读原文”直接打开【北京站 | GPU CUDA 进阶课程】报名链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值