【从零学习openCV】IOS7人脸识别实战
前言
接着上篇《IOS7下的人脸检測》,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型。可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了。
原理:
从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进行人脸识别。
眼下FaceRecognizer类支持的人脸识别有三种,特征脸EigenFace、Fisher脸FisherFace、局部二元模式直方图LBPHFace。分别调用函数createEigenFaceRecognizer、createFisherFaceRecognizer、createLBPHFaceRecognizer建立模型,以下分别对三种方法做介绍。
EigenFace
顾明思议事实上就是特征脸的方法,也称为基于主成分分析(principal component analysis,简称PCA)的人脸识别方法,至于什么是PCA及其原理能够看看这篇:特征脸(Eigenface)理论基础-PCA(主成分分析法)。特征子脸技术的基本思想是:从统计的观点,寻找人脸图像分布的基本元素,即人脸图像样本集协方差矩阵的特征向量,以此近似地表征人脸图像。这些特征向量称为特征脸(Eigenface)。
实际上,特征脸反映了隐含在人脸样本集合内部的信息和人脸的结构关系。将眼睛、面颊、下颌的样本集协方差矩阵的特征向量称为特征眼、特征颌和特征唇,统称特征子脸。特征子脸在对应的图像空间中生成子空间,称为子脸空间。计算出測试图像窗体在子脸空间的投影距离,若窗体图像满足阈值比較条件,则推断其为人脸。
基于特征分析的方法,也就是将人脸基准点的相对照率和其他描写叙述人脸脸部特征的形状參数或类别參数等一起构成识别特征向量,这样的基于总体脸的识别不仅保留了人脸部件之间的拓扑关系,并且也保留了各部件本身的信息,而基于部件的识别则是通过提取出局部轮廓信息及灰度信息来设计详细识别算法。如今Eigenface(PCA)算法已经与经典的模板匹配算法一起成为測试人脸识别系统性能的基准算法;而自1991年特征脸技术诞生以来,研究者对其进行了各种各样的实验和理论分析,FERET'96測试结果也表明,改进的特征脸算法是主流的人脸识别技术,也是具有最好性能的识别方法之中的一个。
FisherFace
主成分分析是一种基于特征脸的方法,找到使数据中最慷慨差的特征线性组合。这是一个表现数据的强慷慨法,但它没有考虑类别信息,而且在扔掉主元时,同一时候很多有鉴别的信息都被扔掉。如果你数据库中的变化主要是光照变化,那么PCA此时差点儿失效了。
线性鉴别分析在降维的同一时候考虑类别信息,由统计学家 Sir R. A. Fisher发明。其诉求是为了找到一种特征组合方式,达到最大的类间离散度和最小的类内离散度。这个想法非常easy:在低维表示下,同样的类应该紧紧的聚在一起,而不同的类别尽量距离越远。 这也被Belhumeur, Hespanha 和 Kriegman所认同,所以他们把鉴别分析引入到人脸识别问题中。
LBPH
LBP的基本思想是对图像的像素和它局部周围像素进行对照后的结果进行求和。把这个像素作为中心,对相邻像素进行阈值比較。假设中心像素的亮度大于等于他的相邻像素,把他标记为1,否则标记为0。你会用二进制数字来表示每一个像素,比方11001111。因此,因为周围相邻8个像素,你终于可能获取2^8个可能组合,被称为局部二值模式,有时被称为LBP码。
以上内容部分摘自于http://m.blog.csdn.net/blog/ningningxl/10903581,假设更深入地了解这三种算法,能够看看这篇文章。
案例实战
好了,直接进入正题,这里我採用openCV的createEigenFaceRecognizer方法,其它的两种方法大同小异。程序还是在上篇的基础上进行修改,请參看:【从零学习openCV】IOS7下的人脸检測
界面设计例如以下,应该非常easy看出各个功能控件是干啥的吧 :-)
以下对每个功能进行说明:
选择照片:这个请參考我之前的文章。
检測裁剪
代码例如以下,详细原理请看我上篇文章。
- (void) opencvFaceDetect {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
UIImage* img = [image copy];
if(img) {
cvSetErrMode(CV_ErrModeParent);
IplImage *image = [self CreateIplImageFromUIImage:img]; IplImage *grayImg = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); //先转为灰度图
cvCvtColor(image, grayImg, CV_BGR2GRAY); //将输入图像缩小4倍以加快处理速度
int scale = 4;
IplImage *small_image = cvCreateImage(cvSize(image->width/scale,image->height/scale), IPL_DEPTH_8U, 1);
cvResize(grayImg, small_image); //载入分类器
NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad([path cStringUsingEncoding:NSASCIIStringEncoding], NULL, NULL, NULL);
CvMemStorage* storage = cvCreateMemStorage(0);
cvClearMemStorage(storage); //关键部分,使用cvHaarDetectObjects进行检測,得到一系列方框
CvSeq* faces = cvHaarDetectObjects(small_image, cascade, storage ,1.1, (int)self.slider.value, CV_HAAR_DO_CANNY_PRUNING, cvSize(0,0), cvSize(0, 0)); NSLog(@"faces:%d",faces->total);
cvReleaseImage(&small_image);
cvReleaseImage(&grayImg); if(faces->total>0)
{
CvRect cvrect = *(CvRect*)cvGetSeqElem(faces, 0); //默认取第一张人脸
cvSetImageROI(image, cvRect(cvrect.x*scale, cvrect.y*scale , cvrect.width*scale, cvrect.height*scale)); //设置ROI,实现区域裁剪
RoIImg = cvCreateImage(cvSize(cvrect.width*scale,cvrect.height*scale), IPL_DEPTH_8U, 3);
cvCvtColor(image, RoIImg, CV_BGR2RGB);
cvResetImageROI(image);
self.imageView.image = [self UIImageFromIplImage:RoIImg];
}
cvReleaseImage(&image);
} [pool release];
}
增加训练
得到了裁剪后的图片还须要对训练图片进行预处理,先转为灰度图,而且调整为同一大小(我设成了50*50),这些都是EigenFaceRecognizer的要求,最后进行归一化,防止光照带来的影响。
- (IBAction)addTrainClicked:(id)sender {
IplImage *grayImg = cvCreateImage(cvGetSize(RoIImg), IPL_DEPTH_8U, 1); //先转为灰度图
cvCvtColor(RoIImg, grayImg, CV_BGR2GRAY);
IplImage *small_image = cvCreateImage(cvSize(50,50), IPL_DEPTH_8U, 1); //统一大小
cvResize(grayImg, small_image);
cv::Mat cur_mat = cv::cvarrToMat(small_image,true),des_mat;
cv::normalize(cur_mat,des_mat,0, 255, cv::NORM_MINMAX, CV_8UC1); //归一化
images.push_back(des_mat);
int labelnum = [self.labelEdit.text intValue]; //得到编辑框的数字,作为此图像的label
labels.push_back(labelnum);
self.addTrainBtn.enabled = NO;
}
生成模型
直接调用createEigenFaceRecognizer就可以,选取PCA主成分维度为10
- (IBAction)GetModelClicked:(id)sender {
model = cv::createEigenFaceRecognizer(10);//PCA主成分的维数为10
model->train(images,labels);
NSLog(@"生成模型!");
}
人脸识别
点击预測button就能够用得到的模型对人脸图片进行预測了,注意打开一张照片后得先进行检測裁剪后才干预測。
- (IBAction)PredictClicked:(id)sender {
IplImage *grayImg = cvCreateImage(cvGetSize(RoIImg), IPL_DEPTH_8U, 1); //先转为灰度图
cvCvtColor(RoIImg, grayImg, CV_BGR2GRAY);
IplImage *small_image = cvCreateImage(cvSize(50,50), IPL_DEPTH_8U, 1); //统一大小
cvResize(grayImg, small_image);
cv::Mat cur_mat = cv::cvarrToMat(small_image,true),des_mat;
cv::normalize(cur_mat,des_mat,0, 255, cv::NORM_MINMAX, CV_8UC1); //归一化
int pred = model->predict(des_mat);
NSString* tip = [NSString stringWithFormat:@"label:%d",pred];
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"识别结果" message:tip delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil];
[alter show];
NSLog(@"%d",pred);
}
终于效果:
步骤1:先对杨幂女神的三张写真进行检測裁剪,改训练label为1,点击增加训练button。
步骤2:再对诗诗女神的三张写真进行检測裁剪,改训练label为2,点击增加训练button。
步骤3:点击生成模型button。
步骤4:打开杨幂女神的另外一张照片,进行检測裁剪后,点击预測,识别结果为1,匹配正确。
步骤5:打开诗诗女神的另外一张照片,进行检測裁剪后,点击预測,识别结果为2,匹配正确。
可见openCV的特征脸算法能识别出美女之间的差异O(∩_∩)O
最后整个案例代码奉上,为期末考攒人品吧:IOS7下用openCV实现人脸检測加识别demo
(转载请注明作者和出处:Shawn-HT
http://blog.csdn.net/shawn_ht 未经同意请勿用于商业用途)
參考文章:
http://blog.csdn.net/liulina603/article/details/7925170
http://m.blog.csdn.net/blog/ningningxl/10903581
http://www.muxiaofei.com/class-facerecognizer-on-the-opencv-face-recognition-face-recognition/
【从零学习openCV】IOS7人脸识别实战的更多相关文章
- 【从零学习openCV】IOS7下的人脸检測
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...
- 学习笔记TF058:人脸识别
人脸识别,基于人脸部特征信息识别身份的生物识别技术.摄像机.摄像头采集人脸图像或视频流,自动检测.跟踪图像中人脸,做脸部相关技术处理,人脸检测.人脸关键点检测.人脸验证等.<麻省理工科技评论&g ...
- 使用OpenCV进行人脸识别
不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...
- 基于 OpenCV 的人脸识别
基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...
- PyQt5+Caffe+Opencv搭建人脸识别登录界面
PyQt5+Caffe+Opencv搭建人脸识别登录界面(转载) 最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的 ...
- OpenCV学习 物体检测 人脸识别 填充颜色
介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...
- 利用Java调用OpenCV进行人脸识别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt409 今天我准备学习如何用Java来进行人脸检测.人脸检测有助于在任何数字图 ...
随机推荐
- centos7.2安装mysql5.7
1.安装前工作 在安装前需要确定现在这个系统有没有 mysql,如果有那么必须卸载(在 centos7 自带的是 mariaDb 数据库,所以第一步是卸载数据库). 卸载系统自带的Mariadb: 查 ...
- 使用django发送邮件时的连接超时问题解决
一.报错 研究报错半天,没看出代码有什么毛病,就是发送邮件时连接超时,发送邮件的连接用户名密码都没有错误,于是就网上各种查... 终于皇天不负有心人,找到答案了.. 在服务器上输入telnet smt ...
- Hive(九)Hive 执行过程实例分析
一.Hive 执行过程概述 1.概述 (1) Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等 (2)操作符 Opera ...
- PHP随机浮点数
function randomFloat($min = 0, $max = 1) { $rand = mt_rand(); $lmax = mt_getrandmax(); return $min + ...
- 黑马程序员_java基础笔记(06)...集合
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— JavaApi(其实就是java给我们提供的已经定义好的对象.工具对象:集合框架) ...
- HDU - 5999 The Third Cup is Free 贪心 简单题
The Third Cup is Free Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- “通用类型系统”(CTS)
一.什么是“通用类型系统”(CTS) 描述类型的定义和行为 二.CTS规范 一个类型可以包含零个或者多个成员1,成员①字段(Field)作为对象状态一部分的数据变量.字段根据名称和类型来区分②方法(M ...
- Swift2.0语言教程之类的属性
Swift2.0语言教程之类的属性 类 虽然函数可以简化代码,但是当一个程序中出现成百上千的函数和变量时,代码还是会显得很混乱.为此,人们又引入了新的类型——类.它是人们构建代码所用的一种通用.灵活的 ...
- luogu P2439 [SDOI2005]阶梯教室设备利用
题目链接 luogu P2439 [SDOI2005]阶梯教室设备利用 题解 dp 代码 #include<vector> #include<cstdio> #include& ...
- OI刷题记录(Updating)
[Counter] [AGC]:0/96 [ARC]:0/70 [2016年省选]:0/69 [2017年省选]:22/75 [2018年省选]:0/63 [ZROI2018]:0/30 [ZROI2 ...