# FaceRecognition
之前公司项目需要,研究了一下人脸识别和活体识别,并运用免费的讯飞人脸识别,在其基础上做了二次开发,添加了活体识别。项目需要就开发了张嘴和摇头两个活体动作的识别。 这里简单介绍一下当时的开发思路和一些个人拙见,欢迎大神指点。
首先说一下讯飞第三方的人脸识别的几个缺点:1.识别不稳定,各点坐标跳动偏差比较大,不容易捕捉;2.CPU使用率比较高,连续识别一会儿手机会明显发烫,手机配置低的,就会反应很慢,本人使用的iPhone 6s,配置还可以,还算比较流畅,但也会发烫。3.屏幕小的手机识别率相对会低一点,当然这也和手机的配置脱不了干系。
# 目录
1. [确定位置](https://github.com/fuzheng0301/FaceRecognition/blob/master/README.md#确定位置)
2. [张嘴识别](https://github.com/fuzheng0301/FaceRecognition/blob/master/README.md#张嘴识别)
3. [摇头识别](https://github.com/fuzheng0301/FaceRecognition/blob/master/README.md#摇头识别)
4. [其他细节](https://github.com/fuzheng0301/FaceRecognition/blob/master/README.md#其他细节)
5. [尾声](https://github.com/fuzheng0301/FaceRecognition/blob/master/README.md#尾声)
下面开始我们的活体识别开发之路:
## 确定位置
讯飞的人脸识别坐标跳动比较大,如果全屏识别发现很容易出现错误的识别,导致识别错误的被通过,所以为了降低这个可能性,特意加了脸部位置的限制,把识别位置和范围大大缩小,大大提高了识别精度和成功率。
原版的Demo里给出了人脸框的坐标,也显示出了人脸的框,代码如下:
```
-(void)drawPointWithPoints:(NSArray *)arrPersons
{
if (context) {
CGContextClearRect(context, self.bounds) ;
}
context = UIGraphicsGetCurrentContext();
for (NSDictionary *dicPerson in arrPersons) {
if ([dicPerson objectForKey:POINTS_KEY]) {
for (NSString *strPoints in [dicPerson objectForKey:POINTS_KEY]) {
CGPoint p = CGPointFromString(strPoints);
CGContextAddEllipseInRect(context, CGRectMake(p.x - 1 , p.y - 1 , 2 , 2));
}
}
BOOL isOriRect=NO;
if ([dicPerson objectForKey:RECT_ORI]) {
isOriRect=[[dicPerson objectForKey:RECT_ORI] boolValue];
}
if ([dicPerson objectForKey:RECT_KEY]) {
CGRect rect=CGRectFromString([dicPerson objectForKey:RECT_KEY]);
if(isOriRect){//完整矩形
CGContextAddRect(context,rect) ;
}
else{ //只画四角
// 左上
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y+rect.size.height/8);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width/8, rect.origin.y);
//右上
CGContextMoveToPoint(context, rect.origin.x+rect.size.width*7/8, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y+rect.size.height/8);
//左下
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y+rect.size.height*7/8);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y+rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width/8, rect.origin.y+rect.size.height);
//右下
CGContextMoveToPoint(context, rect.origin.x+rect.size.width*7/8, rect.origin.y+rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y+rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y+rect.size.height*7/8);
}
}
}
[[UIColor greenColor] set];
CGContextSetLineWidth(context, 2);
CGContextStrokePath(context);
}
```
在这段代码的启发下,我对此作了改装,把动态的人脸框,改成了静态的框,这个静态框,就是指示和限定人脸位置的框,根据屏幕大小画出的,代码如下:
```
-(void)drawFixedPointWithPoints:(NSArray *)arrFixed
{
for (NSDictionary *dicPerson in arrFixed) {
if ([dicPerson objectForKey:POINTS_KEY]) {
for (NSString *strPoints in [dicPerson objectForKey:POINTS_KEY]) {
CGPoint p = CGPointFromString(strPoints);
CGContextAddEllipseInRect(context, CGRectMake(p.x - 1 , p.y - 1 , 2 , 2));
}
}
if ([dicPerson objectForKey:RECT_KEY]) {
CGRect rect=CGRectFromString([dicPerson objectForKey:RECT_KEY]);
// 左上
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y+rect.size.height/8);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width/8, rect.origin.y);
//右上
CGContextMoveToPoint(context, rect.origin.x+rect.size.width*7/8, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y+rect.size.height/8);
//左下
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y+rect.size.height*7/8);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y+rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width/8, rect.origin.y+rect.size.height);
//右下
CGContextMoveToPoint(context, rect.origin.x+rect.size.width*7/8, rect.origin.y+rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y+rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x+rect.size.width, rect.origin.y+rect.size.height*7/8);
}
}
[[UIColor blueColor] set];
CGContextSetLineWidth(context, 2);
CGContextStrokePath(context);
}
```
这里的框是限定脸部位置的,所以脸部位置超出设置的范围的时候,就需要停止人脸识别,停止动作识别,并给出用户提示,提示用户调整位置,或者明确告诉用户,脸部距离屏幕太近了,或者太远了。判定脸部位置的代码如下:
```
#pragma mark --- 判断位置
-(BOOL)identifyYourFaceLeft:(CGFloat)left right:(CGFloat)right top:(CGFloat)top bottom:(CGFloat)bottom
{
//判断位置
if (right - left < 230 || bottom - top < 250) {
self.textLabel.text = @"太远了...";
[self delateNumber];//清数据
isCrossBorder = YES;
return YES;
}else if (right - left > 320 || bottom - top > 320) {
self.textLabel.text = @"太近了...";
[self delateNumber];//清数据
isCrossBorder = YES;
return YES;
}else{
if (isJudgeMouth != YES) {
self.textLabel.text = @"请重复张嘴动作...";
[self tomAnimationWithName:@"openMouth" count:2];
#pragma mark --- 限定脸部位置为中间位置
if (left < 100 || top < 100 || right > 460 || bottom > 400) {
isCrossBorder = YES;
isJudgeMouth = NO;
self.textLabel.text = @"调整下位置先...";
[self delateNumber];//清数据
return YES;
}
}else if (isJudgeMouth == YES && isShakeHead != YES) {
self.textLabel.text = @"请重复摇头动作...";
[self tomAnimationWithName:@"shakeHead" count:4];
number = 0;
}else{
takePhotoNumber += 1;
if (takePhotoNumber == 2) {
[self timeBegin];
}
}
isCrossBorder = NO;
}
return NO;
}
```
这个方法基于Demo中第三方封装库中给的代理方法-(NSString*)praseDetect:(NSDictiona
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
毕业设计-人脸识别-活体识别-跑在iphone上-项目源码分享-期末大作业.zip (173个子文件)
IFlySpeechConstant.h 17KB
IFlySpeechConstant.h 17KB
IFlySpeechRecognizer.h 7KB
IFlySpeechRecognizer.h 7KB
IFlyIdentityVerifier.h 7KB
IFlyIdentityVerifier.h 7KB
IFlyRecognizerView.h 6KB
IFlyRecognizerView.h 6KB
IFlySpeechUnderstander.h 6KB
IFlySpeechUnderstander.h 6KB
IFlySpeechEvent.h 5KB
IFlySpeechEvent.h 5KB
IFlyVoiceWakeuper.h 4KB
IFlyVoiceWakeuper.h 4KB
CalculatorTools.h 4KB
CalculatorTools.h 4KB
IFlySpeechSynthesizer.h 4KB
IFlySpeechSynthesizer.h 4KB
IFlySpeechUtility.h 3KB
IFlySpeechUtility.h 3KB
IFlyFaceConstant.h 3KB
IFlyFaceConstant.h 3KB
IFlySpeechRecognizerDelegate.h 3KB
IFlySpeechRecognizerDelegate.h 3KB
IFlyISVRecognizer.h 3KB
IFlyISVRecognizer.h 3KB
IFlySpeechFaceRequest.h 3KB
IFlySpeechFaceRequest.h 3KB
IFlyFaceRequest.h 3KB
IFlyFaceRequest.h 3KB
IFlyFaceDetector.h 3KB
IFlyFaceDetector.h 3KB
IFlySpeechPlusSDKInterface.h 3KB
IFlySpeechPlusSDKInterface.h 3KB
CaptureManager.h 2KB
CaptureManager.h 2KB
IFlySetting.h 2KB
IFlySetting.h 2KB
IFlySpeechEvaluatorDelegate.h 2KB
IFlySpeechEvaluatorDelegate.h 2KB
IFlySpeechPlusSDKTTS.h 2KB
IFlySpeechPlusSDKTTS.h 2KB
IFlyVoiceWakeuperDelegate.h 2KB
IFlyVoiceWakeuperDelegate.h 2KB
IFlyPcmRecorder.h 2KB
IFlyPcmRecorder.h 2KB
IFlyUserWords.h 2KB
IFlyUserWords.h 2KB
IFlySpeechEvaluator.h 1KB
IFlySpeechEvaluator.h 1KB
IFlySpeechSynthesizerDelegate.h 1KB
IFlySpeechSynthesizerDelegate.h 1KB
IFlyFaceResultKeys.h 1KB
IFlyFaceResultKeys.h 1KB
IFlyResourceUtil.h 1KB
IFlyResourceUtil.h 1KB
IFlySpeechFaceDetector.h 1KB
IFlySpeechFaceDetector.h 1KB
IFlyDataUploader.h 1KB
IFlyDataUploader.h 1KB
IFlyTextUnderstander.h 1KB
IFlyTextUnderstander.h 1KB
IFlyFaceSDK.h 1KB
IFlyFaceSDK.h 1KB
IFlyFaceImage.h 1KB
IFlyFaceImage.h 1KB
IFlyIdentityVerifierDelegate.h 929B
IFlyIdentityVerifierDelegate.h 929B
IFlySpeechFaceRequestDelegate.h 843B
IFlySpeechFaceRequestDelegate.h 843B
IFlyFaceRequestDelegate.h 825B
IFlyFaceRequestDelegate.h 825B
DemoPreDefine.h 795B
DemoPreDefine.h 795B
IFlyContact.h 786B
IFlyContact.h 786B
UIImage+Extensions.h 756B
UIImage+Extensions.h 756B
IFlySpeechError.h 744B
IFlySpeechError.h 744B
IFlyRecognizerViewDelegate.h 742B
IFlyRecognizerViewDelegate.h 742B
IFlyVerifierUtil.h 722B
IFlyVerifierUtil.h 722B
IFlyIdentityResult.h 642B
IFlyIdentityResult.h 642B
FaceStreamDetectorViewController.h 637B
FaceStreamDetectorViewController.h 637B
IFlyISVDelegate.h 623B
IFlyISVDelegate.h 623B
IFlySpeechPlusSDKBusiness.h 599B
IFlySpeechPlusSDKBusiness.h 599B
PermissionDetector.h 574B
PermissionDetector.h 574B
CanvasView.h 433B
CanvasView.h 433B
AppDelegate.h 281B
AppDelegate.h 281B
ViewController.h 254B
ViewController.h 254B
共 173 条
- 1
- 2
资源评论
__AtYou__
- 粉丝: 3218
- 资源: 974
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功